编译器如何处理类中的枚举定义是否有一般性的方法,如果它在private:
中使用枚举,但之后在public:
部分中定义它是否有效?
代码示例:
class MyClass{
private:
myEnum myMember;
public
enum myEnum { A, B, C };
}
似乎使用gpp工作,但这是正确的用法吗?
答案 0 :(得分:6)
你需要反过来这样做
class MyClass{
public:
enum myEnum { A, B, C };
private:
myEnum myMember;
};
因此您在使用前定义枚举。但是,将枚举的定义公开,但将其存储在私有状态很好 - 您可能不希望用户能够直接写入myMember
,但您希望他们了解它是什么类函数返回myEnum
。
答案 1 :(得分:2)
如果要正确地编写类,那么它至少会编译
class MyClass
{
public:
enum myEnum { A, B, C };
private:
myEnum myMember;
};
然后班上有两个成员。第一个是类型
的定义 enum myEnum { A, B, C };
它是公开的。
第二个是私有类型myMember
的数据成员enum myEnum
的定义。
因此,该类的用户可以使用类型名称enum myEnum
,并且无法直接访问数据成员myMember
一个更有趣的例子,当类型被定义为私有时,但这种类型的数据成员被定义为public。例如,考虑以下类定义
class MyClass
{
private:
enum myEnum { A = 10, B, C };
public:
myEnum myMember = A;
};
在这种情况下,您无法访问枚举名称。如果您将尝试以下程序
#include <iostream>
class MyClass
{
private:
enum myEnum { A = 10, B, C };
public:
myEnum myMember = A;
};
int main()
{
MyClass c;
myEnum x = c.myMember;
//MyClass::myEnum x = c.myMember;
std::cout << x << std::endl;
return 0;
}
您将收到编译错误。但是,您可以通过替换
来欺骗编译器myEnum x = c.myMember;
与
auto x = c.myMember;
以下程序将编译
#include <iostream>
class MyClass
{
private:
enum myEnum { A = 10, B, C };
public:
myEnum myMember = A;
};
int main()
{
MyClass c;
auto x = c.myMember;
std::cout << x << std::endl;
return 0;
}