标志,枚举(C)[英] Flags, enum (C)

本文是小编为大家收集整理的关于标志,枚举(C)的处理方法,想解了标志,枚举(C)的问题怎么解决?标志,枚举(C)问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我不是很习惯用旗帜编程,但我想我刚刚发现的情况下,他们会是有用的:

我有一对夫妇说自己注册为听众对某些事件的对象.他们为依赖于它们被构造时被发送给他们的可变注册事件.我认为,一个不错的方法,这样做会给人以位或连接的变量,像这样的:TAKES_DAMAGE | GRABBABLE |液体等.然后,在构造函数中,对象可以检查设置什么标志和注册它自身作为监听器是的人.

但是,这是我感到困惑. preferably,这些标志将是一个枚举.但是,这也是个问题.如果我们有这些标志:

 枚举
{
    TAKES_DAMAGE,/ *(0)* /
    GRABBABLE,/ *(1)* /
    LIQUID,/ *(2)* /
    SOME_OTHER / *(3)* /
};

然后发送该标志SOME_OTHER(3)将是相同的发送GRABBABLE | LIQUID,将不是吗?

究竟如何做你处理这东西?


解决方案

您枚举需要成为两个大国:

 枚举
{
    TAKES_DAMAGE = 1,
    GRABBABLE = 2,
    液= 4,
    SOME_OTHER = 8
};

另外,在一个更​​易读的方式:

 枚举
{
    TAKES_DAMAGE = 1&所述;&下; 0,
    GRABBABLE = 1&所述;&下; 1,
    液体= 1<< 2,
    SOME_OTHER = 1&所述;&下; 3
};

为什么呢?因为你希望能够标志没有重叠结合,也能够做到这一点:

 如果(myVar的&安培; GRABBABLE)
{
    // grabbable code
}

...如果枚举值看起来像这里面的作品:

  TAKES_DAMAGE:00000001
 GRABBABLE:00000010
 液体:00000100
 SOME_OTHER:00001000

所以,说你已经设置 myVar的到 GRABBABLE | TAKES_DAMAGE ,这里的工作原理是当你需要检查GRABBABLE标志:

  myVar的:00000011
 GRABBABLE:00000010 [和]
 -------------------
            00000010 //非零= GT;转换为真正的

如果您想设置 myVar的到液体| SOME_OTHER ,该操作将导致:

  myVar的:00001100
 GRABBABLE:00000010 [和]
 -------------------
            00000000 //零=>转换为假

本文地址:https://www.itbaoku.cn/post/359011.html