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
}
- 我必须使用数组还是向量?如果是,如何进行
- 在这种情况下,枚举是个好主意吗
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 数据结构。这在处理可能不是处理器本机数据类型偶数倍的多个标志(位)时应该很有用。