从父类访问Enum的语法

时间:2017-10-02 17:17:30

标签: c++ enums

我收到程序错误。显然我错过了一些关于语法的东西。下面的C ++代码片段是产生错误的最小代码。

#include <iostream>
using namespace std;

class Parent
{
    public:
    enum MyEnum {
        Value1,
        Value2,
        Value3
    };

    MyEnum* set;
};

class Child: public Parent
{
    public:
    Child()
    {
      set = new MyEnum[5];
      set[0]=MyEnum.Value1;//<--Something wrong here
      set[1]=MyEnum.Value2;//<--Something wrong here
      set[2]=MyEnum.Value3;//<--Something wrong here
      set[3]=MyEnum.Value2;//<--Something wrong here
      set[4]=MyEnum.Value1;//<--Something wrong here
    }

    void Write()
    {
        for(int i=0;i<5;i++)
        {
            cout<< "This is " << i << ": " << set[i];
        }
    }
};

int main() {
    Child c;
    c.Write();

    return 0;
}

错误与指定的语法有关。

 expected primary-expression before ‘.’ token

我已经尝试过Parent.MyEnum.Value1,Parent :: MyEnum.Value1等,似乎没什么。我应该如何引用父类中的特定值?

2 个答案:

答案 0 :(得分:3)

Enums不需要对其值进行限定,这意味着您应该像这样访问它们:

set[0] = Parent::Value1;

如果您想强制执行资格认证,可以使用强类型枚举。它看起来像这样:

enum struct MyEnum {
    Value1,
    Value2,
    Value3
};

set[0] = Parent::MyEnum::Value1;

但是你应该使用显式转换来打印它们,例如:

cout << static_cast<int>(set[0]) << endl;

答案 1 :(得分:1)

enumclass一样,定义范围。像你一样使用的常规枚举将其枚举器名称放在它自己的范围和它的包含范围内。 由于这是范围解析而非会员访问权限,因此您使用::代替. 。因此,您可以使用Parent::Value1Value1(因为public中的protectedParent名称可见Child)或{{1 }或Parent::MyEnum::Value1

如果您想禁止使用第一个或第二个选项,则应使用MyEnum::Value1而不是enum class