无法理解C ++中的枚举,它们实际上是什么?

时间:2013-12-22 15:31:09

标签: c++ enums

过去几年我用C#编程,现在我又回到了C ++。在C#中,enums的行为类似:

enum myenum { a,b,c} 
myenum myinstance = myenum.a;

所以我可以这样做:

enum myenum { a,b,c}     
enum myenum2 { a,b,c} 

myenum myinstance = myenum.a;

一切都会好的。

在C ++中它没有编译,而且我现在无法使用a(或bc)作为类名或其他任何内容,似乎喜欢写作:

enum myenum { a, b };

与声明全局int变量相同:

int a =0, b=1;

我不明白为什么C ++的开发人员会为枚举选择这种行为,以及枚举是什么?它是一种类型?或者只是编译器用某些int声明替换的东西?

3 个答案:

答案 0 :(得分:7)

如果您有权访问C ++ 11编译器,请使用enum class。这些也被称为强类型枚举。

enum class myenum { a,b,c};     
enum class myenum2 { a,b,c}; 

myenum myinstance = myenum::a;

这有你期望的行为。

但请注意,它们不能像经典C ++ int一样隐式转换为enum

到最后的问题 : C ++枚举不同类型,但不幸的是它们可以隐式转换为int,正如您已经注意到的那样,它们没有自己的命名空间。这是该语言及其C传承的历史文物。我在这里描述的强类型枚举没有这些问题。

有关它们和某些背景的更多信息,请查看this article

答案 1 :(得分:3)

C ++枚举值是全局定义的,所以你注意到,如果你写这样的枚举:

enum my_enum { a , b , c };

acd是全球名称。

对此的经典解决方案是使用标识符作为前缀,例如枚举的名称:

enum my_enum
{
    MY_ENUM_A , 
    MY_ENUM_B , 
    MY_ENUM_C
};

然而,C ++ 11添加了强类型枚举,它以范围形式定义其值:

enum class my_enum { a , b , c };

my_enum one = my_enum::a; //ok
my_enum two = a;          //This not compiles, because a is not defined in this scope.

答案 2 :(得分:1)

您可能希望将枚举包含在命名空间中,以便可以执行此操作

namespace myenum2
{
enum myenum2_enum
{ a,b,c };
}

namespace myenum
{
enum myenum_enum
{ a,b,c };
}

那么你可以使用myenum :: a或myenum2 :: b等等...来自C#我知道你觉得这是最接近的事情'感觉'就像是同一件事,因为enums本身就是一个集合全局