2012-01-07 181 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