在下文中,我不知道我是否在C#中使用C ++来混淆枚举,但是
我以为你只能使用Forms::shape
来访问enum中的枚举器,这实际上会产生错误。
int main()
{
enum Forms {shape, sphere, cylinder, polygon};
Forms form1 = Forms::shape; // error
Forms form2 = shape; // ok
}
为什么在没有范围运算符的情况下允许在枚举之外访问shape
以及如何防止此行为?
答案 0 :(得分:5)
好吧,因为枚举不形成声明范围。这就是它在C ++中的方式。您希望将这些枚举常量封装在专用范围中,自己创建一个:使用包装类或命名空间。
即将推出的C ++标准将引入新的枚举,它确实产生了自己的范围。
答案 1 :(得分:1)
在您的示例中,枚举未在类中声明,因此它没有特定的范围。您可以定义一个结构 - 一个结构是一个所有成员在C ++中都是公共的类 - 包含您的枚举,并使用该类的名称来提供范围。
你也可以创建一个命名空间,并将你的枚举放在其中。但这可能有点矫枉过正。
答案 2 :(得分:0)
我建议潜在的原因来自C兼容性。
答案 3 :(得分:0)
C ++ 11引入了scoped enumerations,它可以保持命名空间的清晰,并防止与int
类型的无意组合。使用关键字序列enum class
声明范围内的枚举。
通过使用范围的枚举,您的上述示例将变为:
int main()
{
enum class Forms {shape, sphere, cylinder, polygon}; // mind the "class" here
Forms form1 = Forms::shape; // ok
Forms form2 = shape; // error
}