C ++中的默认枚举可见性

时间:2011-02-17 15:16:03

标签: c++ enums visibility

我有一个看起来像这样的课程:

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 ++中的枚举需要给出明确的可见性指令吗?如果没有给出,他们默认为私人吗?保护?

7 个答案:

答案 0 :(得分:9)

enum服从类的可见性,就像属性,方法,嵌套类或其他任何东西一样。您需要将其设为public以获得外部可见性。

这样,类可以拥有自己的私有方法使用的私有枚举,而不会将enum值暴露给外部世界。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

他们没有任何不同于任何其他成员的默认值。由于private是默认值,因此适用于enum,就像对任何其他成员一样。不确定为什么你认为你所看到的行为与成员是enum的事实有关。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

如果枚举需要公开,你应该把它嵌入另一个类吗?我发现将枚举放在自己的命名空间而不是另一个类中是方便和自我记录的。您将命名空间排序视为类名,并忽略实际的枚举名称。这允许您给枚举成员提供真正好的名称而不会发生冲突或必须使用匈牙利语命名方法。例如,在您的问题中,如果我们有一个命名空间LedState和一个包含On和Off成员的枚举状态,那么您只需使用LedState :: On或LedState :: Off。在LedState命名空间之外使用typedef,例如:

 typedef LedState::State LedStateType 

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