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

6

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

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++中,枚举类型需要明确的可见度指令吗?如果没有给定任何指令,它们会默认为私有(private)或受保护(protected)吗?

@David Thornley 那个问题涉及Java,看起来有点不同。 - Mark B
@Mark B:语言方面我的错误,感谢您指出。 - David Thornley
7个回答

13

enum枚举类型和属性、方法、嵌套类或其他任何内容一样需要遵守类的可见性规则。如果需要让其在外部也可见,就需要将其声明为public

这么做是为了让类可以拥有私有的enum枚举类型,而不会暴露给外界。


4

如果您没有特别指定,所有的类成员(包括枚举)都是私有的。同样地,如果您没有特别指定,所有的结构体成员都是公共的。


1

如果一个枚举需要是公共的,你应该将它嵌套在另一个类中吗?我发现将枚举放在自己的命名空间中而不是另一个类中既方便又易于自我记录。你把命名空间看作类名,忽略实际的枚举名称。这使你能够给枚举成员取得非常好的名称,而不会冲突或必须使用匈牙利命名法。例如,在你的问题中,如果我们有一个名为LedState的命名空间和一个名为State的枚举,其中包含On和Off成员,则只需使用LedState::On或LedState::Off。在LedState命名空间外部使用typedef,如下所示:

 typedef LedState::State LedStateType 

你可以忽略枚举的实际名称,以便该名称可以重新使用而不会冲突。如果需要传递枚举,则只需将其声明为LedStateType类型即可。我在最近的一篇博客文章中写了一个更完整的示例


0
在类的作用域内定义的枚举遵循类作用域中适用于其他所有内容的访问规则。为了使该类型可以在类外部访问,您需要将枚举放置在public:部分。

0

它们的默认值与任何其他成员没有区别。由于 private 是默认设定,这同样适用于 enum 成员,就像对于任何其他成员一样。不确定为什么您认为您看到的行为与成员是 enum 有关。


我认为是因为我刚接触C++,而我的同事告诉了我另外一种方法。听起来不太对,但我没有深究这个问题。看来我需要... - Benjamin Borden

0

私有是C++类的默认访问级别,其类类型为“class”。如果您省略了指定它,您将无法从类的外部访问它。


"struct" 和 "union" 关键字也声明类,因此您需要指定“private 是使用 'class' 类关键字时的默认可访问性”,或类似的内容。并且可见性 != 可访问性,这是一个重要的观点。 - Fred Nurk

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接