许多枚举在同一个类中具有相同成员

时间:2013-08-08 10:54:10

标签: c++ enums

标题说明了一切,但我举一个例子:

class A {
public:
  enum A 
  {
    enumVal1,
    enumVal2
  };

  enum B 
  {
    enumVal1,
    enumVal3,
  };
};

我可以做些什么呢?

提前致谢。

3 个答案:

答案 0 :(得分:4)

C ++不允许您在同一范围内拥有两个相同的标识符。您可以添加前缀以使其清晰:

  enum A 
  {
    A_enumVal1,
    A_enumVal2
  };

  enum B 
  {
    B_enumVal1,
    B_enumVal3
  };

或者您可以将每个枚举放在不同的namespace中并使用A::enumVal1B::enumVal1等。命名空间旨在解决此类问题。

答案 1 :(得分:4)

c++ 11中,您可以使用enum class

class MyClass {
public:
  enum class A 
  {
    enumVal1,
    enumVal2
  };

  enum class B 
  {
    enumVal1,
    enumVal3,
  };
};

比你引用的值为:

MyClass::A::enumVal1
MyClass::B::enumVal1

使用enum classes代替旧枚举也可以为您提供强大的输入。您可以详细了解enum classes here

答案 2 :(得分:1)

C ++ 11具有范围的枚举:

class S {
public:
  enum class A 
  {
    enumVal1,
    enumVal2
  };

  enum class B 
  {
    enumVal1,
    enumVal3,
  };
};

然后,您需要引用A::enumVal1B::enumVal1。即使没有歧义,enumVal2也必须是合格的。此外,枚举器不会像旧样式那样隐式地转换为int;你需要static_cast

这只是简化C ++ 03习语:

class S {
public:
  struct A { enum type
  {
    enumVal1,
    enumVal2
  } value; };

  struct B { enum type 
  {
    enumVal1,
    enumVal3,
  } value; };
};

然后,您需要声明A::typeB::type类型的对象,或者引用.value的{​​{1}}成员。 (其他方法也是可能的。)