【问题标题】:Scope of enumerators枚举器的范围
【发布时间】:2011-11-06 11:20:22
【问题描述】:

在下文中,我不知道我是否将 C# 中的枚举与 C++ 混淆了,但是 我以为您只能使用 Forms::shape 访问枚举中的枚举器,这实际上会产生错误。

int main()
{
    enum Forms {shape, sphere, cylinder, polygon};

    Forms form1 = Forms::shape; // error
    Forms form2 = shape; //  ok
}

为什么shape 允许在没有范围运算符的情况下在枚举之外访问,我该如何防止这种行为?

【问题讨论】:

    标签: c++ enums compiler-errors scope


    【解决方案1】:

    好吧,因为枚举不构成声明范围。这就是它在 C++ 中的方式。您想将这些枚举常量封装在一个专用范围内,自己制作一个:使用包装类或命名空间。

    即将推出的 C++ 标准将引入一种新的枚举类型,它会产生自己的作用域。

    【讨论】:

    • 请注意,相同的作用域也将被移植到 C++0x 中的常规枚举中。不同之处在于 enum class 将强制作用域,而常规 enum 允许您使用 either 作用域。
    • @NicolBolas enum class 不仅强制作用域,请参阅my answer
    【解决方案2】:

    在您的示例中,枚举未在类中声明,因此它没有特定的范围。您可以定义一个结构 - 结构是一个类,其中所有成员在 C++ 中都是公共的 - 包含您的枚举,并使用该类的名称来提供范围。

    您还可以创建一个命名空间并将您的枚举也放入其中。但这可能有点过头了。

    【讨论】:

    • +1,你也可以在类中声明枚举,是的,这很费力。 C++11 引入了scoped enums,它易于使用(并且更安全)。
    【解决方案3】:

    我认为根本原因来自 C 兼容性。

    【讨论】:

      【解决方案4】:

      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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多