2010-04-04 91 views
2

示例:C++设置“标志”

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

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

    // Flags theFlags; (???) 
} 
  • 我怎样才能实现,有可能在一个设置任何数目的“标志” A,B,C和d的在枚举上述MyClass的实例?

我的目标将是这样的:

if (MyClassInst.IsFlagSet(A)) // ... 
MyClassInst.SetFlag(A); //... 
  • 我一定要使用一些数组或向量?如果是,如何?
  • 在这种情况下枚举是一个好主意吗?
+1

问题很不清楚,但你可能想看看std :: bitset。 – 2010-04-04 13:45:21

+0

澄清:我希望MyClass具有设置的任何数量的“标志”枚举。我想知道设置它们的最佳方式,并检查它们是否设置。我想我可以通过一个数组实现:bool flags [5];标志[A] =真;标志[B] = FALSE; // ...,但我怀疑这是最好的方法。 – sub 2010-04-04 13:51:05

回答

2
// Warning, brain-compiled code ahead! 

const int A = 1; 
const int B = A << 1; 
const int C = B << 1; 
const int D = C << 1; 

class MyClass { 
public: 
    bool IsFlagSet(Flags flag) const {return 0 != (theFlags & flag);} 
    void SetFlag(Flags flag)   {theFlags |= flag;} 
    void UnsetFlag(Flags flag)  {theFlags &= ~flag;} 

private: 
    int theFlags; 
} 
+0

谢谢,并会有一种方法(不)一次设置多个标志? – sub 2010-04-04 13:57:08

+0

添加ResetFlag(标志标志){theFlags&=〜标志; }并通过Flags.A | Flags.B例如。 – 2010-04-04 14:04:49

+0

@nobugz:谢谢,如果您不介意的话,我会将其添加到答案中。 (哦,但'Flags.A'不是C++语法。) – sbi 2010-04-04 14:09:33

2

在C,您可以手动设置特殊(非连续)枚举值:

enum Flags 
{ 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8 
}; 

它是类型安全更好地使用:

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

因为(A | B)不是一个你的枚举值。

0

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

第一步是将每个标志的数值设置为指数值2(ex - 1,2,4,8,16,32,64等),所以在二进制中它会看起来像像0001,0010,0100,1000等等。

现在,要设置或删除标志,您需要将其添加到标志变量或将其删除。检查标志的一个例子是这样的:

foo |= A

取消设置于foo这样做:

if(MyClass.Flags & FLAG_A) 
{ 
    // Flag is set 
} 

if(!(MyClass.Flags & FLAG_B)) 
{ 
    // Flag is not set 
} 
0

如果foo是你的位标志,你可以通过做集A于foo :

foo &= (~A)

的d检查,如果通过检查设置于foo如果这个表达式为true

(foo & A) == A

但你必须确保的A,B,C,d是树立正确的(0×01,0×02的值,...)