C ++:使用后的类中的枚举定义

时间:2015-03-17 08:11:29

标签: c++ class enums nested

编译器如何处理类中的枚举定义是否有一般性的方法,如果它在private:中使用枚举,但之后在public:部分中定义它是否有效?

代码示例:

class MyClass{
private:
  myEnum myMember;

public
  enum myEnum { A, B, C };

}

似乎使用gpp工作,但这是正确的用法吗?

2 个答案:

答案 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;
}