过去几年我用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
(或b
或c
)作为类名或其他任何内容,似乎喜欢写作:
enum myenum { a, b };
与声明全局int变量相同:
int a =0, b=1;
我不明白为什么C ++的开发人员会为枚举选择这种行为,以及枚举是什么?它是一种类型?或者只是编译器用某些int声明替换的东西?
答案 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 };
a
,c
和d
是全球名称。
对此的经典解决方案是使用标识符作为前缀,例如枚举的名称:
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本身就是一个集合全局