2012-01-07 169 views
1

多個屬性我已經定義了一個enum結構這樣設置枚舉結構

class myC { 
    enum accessClass { 
    none, 
    forL, 
    forM, 
    forA 
    }; 

    typedef accessClass AccessType; 
    AccessType aType; 
}; 

myC obj; 

問題是我必須選擇只有一個成員。不過,我想選擇多個成員。目前如果我寫

obj->aType = forL; 
obj->aType = forM; 

那麼後者將取代第一個。

我要選擇多個項目/會員/一個enum結構屬性。

我該怎麼辦?

+2

如果你想表示多個值,你將需要一個數組(你可能需要一個'std :: vector')。 – 2012-01-07 18:13:50

+0

你能給一個片段嗎? – mahmood 2012-01-07 18:14:36

+0

如果您知道所有可能的組合,那麼您可以在每個可能的組合中對枚舉進行單獨輸入。 – 2012-01-07 18:15:39

回答

6

使用bitfield

enum MyEnum { 
    A = 1<<0; // 0x01 
    B = 1<<1; // 0x02 
    C = 1<<2; // 0x04 
    D = 1<<3; // 0x08 
    E = 1<<4; // 0x10 
    F = 1<<5; // 0x20 
    ... 
} 

MyEnum m; 

m = A;    // m = 0x01 (Only A is on) 

// Set values by ORing them in. 
m |= F;   // OR in field F. Now m = 0x21 (A and F are on) 

// Set multiple values by ORing them together. 
m = (A | C | E); // m = 0x15 (A, C, and E) 

// Clear values by ANDing them out. 
m &= ~C;   // AND out field C. m = 0x11 (A and E are on) 

// Test values with AND 
if (m & A) 
    printf("A is set\n"); 
if (m & B) 
    printf("B is set\n"); 

請參閱 「使用bitflags」:http://www.dylanleigh.net/notes/c-cpp-tricks.html

+0

抱歉,那是什麼? – mahmood 2012-01-07 18:15:31

+3

或許也解釋瞭如何使用這些:'obj-> A型= F;'清除所有其他標誌,而'obj-> A型| = F;''套和F'獨自離開休息。 – hvd 2012-01-07 18:16:03

+1

@mahmood:查看稱爲萬維網的奇妙發明。它的文件很好。 – 2012-01-07 18:16:39

1

enum實例可以容納多個值只有儘可能的int可以:那就是,根本

選擇一個標準容器(可能是std::set)並用myC::accessClass填充它的對象。

+0

對於你說的那種方式+1。 – 2012-01-07 18:16:45

+0

@Oli:呵呵謝謝 – 2012-01-07 18:17:28

0

如果你想表示多個值,您將需要一個數組(如你在C++中的時候,你可能會想例如std::vector)。例如:

class myC { 
public: 
    enum accessClass { 
    none, 
    forL, 
    forM, 
    forA 
    }; 

    std::vector<accessClass> aTypes; 
}; 

myC obj; 

obj.aTypes.push_back(myC::forL); 
obj.aTypes.push_back(myC::forM); 
+0

似乎不太可能需要訂購。 'std :: set'不會更合適嗎? – 2012-01-07 18:17:10

+0

@LightnessRacesinOrbit:也許吧。我會把它留給OP來擔心! – 2012-01-07 18:21:41

+0

通過這種邏輯,我們可以刪除我們的答案,並把整個事情留給他..:P – 2012-01-07 18:25:30