2010-04-04 105 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的值,...)