【问题标题】:Default enum visibility in C++C++ 中的默认枚举可见性
【发布时间】:2011-06-29 04:23:31
【问题描述】:

我有一个如下所示的课程:

namespace R 
{
class R_Class 
{
   enum R_Enum
   {
       R_val1,
       R_val2,
       R_val3
   }
private:
   // some private stuff
public: 
  // some public stuff
}
}

我正在使用自动化测试工具执行单元测试。编译器声称我的测试工具无法访问类型 R::R_Class::R_Enum。

我可以毫无问题地访问类似定义的类中的值:

namespace S
{
class S_Class
{
public:
   enum S_Enum
   {
       S_val1,
       S_val2,
       S_val3
   }
}
private:
   // some private stuff
public: 
  // some public stuff
}

C++ 中的枚举是否需要明确的可见性指令?如果没有给出,它们是否默认为私有?受保护?

【问题讨论】:

标签: c++ enums visibility


【解决方案1】:

enums 遵循类中的可见性,就像属性、方法、嵌套类或其他任何东西一样。您需要将其设为 public 以供外界查看。

这是为了让类可以拥有由其自己的私有方法使用的私有枚举,而不会将 enum 值暴露给外界。

【讨论】:

    【解决方案2】:

    在类范围内定义的枚举遵循适用于类范围内其他所有内容的访问规则。您需要将枚举放在 public: 部分中,以便在类外部可以访问该类型。

    【讨论】:

      【解决方案3】:

      他们的默认值与任何其他成员没有任何不同。由于private 是默认值,因此它适用于enums,就像它适用于任何其他成员一样。不知道为什么您认为您所看到的行为与该成员是 enum 这一事实有关。

      【讨论】:

      • 我认为这是因为我是 C++ 新手,而一位同事告诉我并非如此。这听起来不对,我没有按这个问题。看来我需要...
      【解决方案4】:

      private 是类类型“class”的 C++ 类的默认可访问性。如果省略指定,则无法从班级外部访问它。

      【讨论】:

      • “struct”和“union”关键字也声明了类,因此您需要指定“private 是使用 'class' 类键时的默认可访问性”或类似内容。和可见性!= 可访问性,很重要的一点。
      【解决方案5】:

      我假设所有类成员默认都是私有的,但我惊讶地发现结构是例外。

      关于 SO 的相关问题:default visibility of C++ class/struct members

      【讨论】:

        【解决方案6】:

        如果您未另行指定,所有class 成员、enum 或其他成员都是私有的。同样,如果您没有另外指定,所有struct 成员都是公开的。

        【讨论】:

          【解决方案7】:

          如果一个枚举需要公开,你应该将它嵌套在另一个类中吗?我发现将枚举放在它们自己的命名空间中而不是另一个类中很方便且可以自我记录。您将命名空间视为类名,而忽略实际的枚举名称。这使您可以为枚举成员提供非常好的名称,而不会发生冲突或不必使用匈牙利命名方法。例如,在您的问题中,如果我们有一个命名空间 LedState 和一个具有成员 On 和 Off 的枚举 State,那么您只需使用 LedState::On 或 LedState::Off。在 LedState 命名空间之外使用 typedef,例如:

           typedef LedState::State LedStateType 
          

          您可以忽略枚举“State”的实际名称,以便可以重用名称而不会发生冲突。如果需要传递枚举,只需将其声明为 LedStateType 类型。我写了一个more complete example in a recent blog entry

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-22
            • 1970-01-01
            • 1970-01-01
            • 2017-03-10
            • 2011-11-15
            • 2011-07-27
            相关资源
            最近更新 更多