C++ C++;设立;旗帜;

C++ C++;设立;旗帜;,c++,design-patterns,C++,Design Patterns,例如: enum Flags { A, B, C, D }; class MyClass { std::string data; int foo; // Flags theFlags; (???) } 如何实现在MyClass实例中设置上述枚举中任意数量的“标志”A、B、C和D 我的目标是这样的: if ( MyClassInst.IsFlagSet( A ) ) // ... MyClassInst.SetFlag( A ); //.

例如:

enum Flags
{
    A,
    B,
    C,
    D
};

class MyClass
{
   std::string data;
   int foo;

   // Flags theFlags; (???)
}
  • 如何实现在MyClass实例中设置上述枚举中任意数量的“标志”A、B、C和D
我的目标是这样的:

if ( MyClassInst.IsFlagSet( A ) ) // ...
MyClassInst.SetFlag( A ); //...
if(MyClass.Flags & FLAG_A)
{
    // Flag is set
}

if(!(MyClass.Flags & FLAG_B))
{
    // Flag is not set
}
  • 我必须使用数组还是向量?如果是,如何进行
  • 在这种情况下,枚举是个好主意吗
在C中,您可以手动设置特殊(非顺序)枚举值:

enum Flags
{
    A = 1,
    B = 2,
    C = 4,
    D = 8
};
最好使用类型安全:

const int A = 1;
const int B = 2; /* ... */

因为
(A | B)
不是您的枚举值之一。

不,您不必使用数组或向量,但您需要的是按位比较

第一步是将每个标志的数值设置为2的指数值(例如-1,2,4,8,16,32,64等等),因此在二进制中它看起来像0001000等等

现在,要设置或删除标志,您需要将其添加到flag变量中,或者删除它。检查标志的示例如下所示:

if ( MyClassInst.IsFlagSet( A ) ) // ...
MyClassInst.SetFlag( A ); //...
if(MyClass.Flags & FLAG_A)
{
    // Flag is set
}

if(!(MyClass.Flags & FLAG_B))
{
    // Flag is not set
}
//警告,大脑提前编译了代码!
常数INTA=1;

const int B=A如果
foo
是您的位标志,您可以通过执行以下操作在foo上设置A:


foo |=A

通过执行以下操作来取消对foo的设置:


foo&=(~A)

并通过检查此表达式是否为true来检查foo上是否设置了A


(foo&A)==A


但您必须确保A、B、C、D的值设置正确(0x01、0x02,…)

问题非常不清楚,但您可能需要查看std::bitset。为了澄清:我希望MyClass设置任意数量的“标志”枚举。我想知道设置它们和检查它们是否设置的最佳方法是什么。我想我可以通过一个数组实现这一点:bool flags[5];标志[A]=真;标志[B]=false;/。。。,但我怀疑这是最好的方法。谢谢,有没有一种方法可以同时(取消)设置多个标志?添加ResetFlag(flags flag){offlags&=~flag;}并传递flags.a | flags.B例如。@nobugz:谢谢,如果你不介意的话,我会在答案中添加这个。(哦,但是<代码>标志。一个< /COD>不是C++语法。)@ St:查看STL <代码> BITSET 数据结构。这在处理可能不是处理器本机数据类型偶数倍的多个标志(位)时应该很有用。