【问题标题】:Syntax accessing Enum from parent class从父类访问枚举的语法
【发布时间】:2018-03-13 19:33:46
【问题描述】:

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

#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 等。似乎没有什么是正确的。我应该如何引用父类中的特定值?

【问题讨论】:

  • MyEnum.Value1;//&lt;--Something wrong here - 语法。如果你有一个常规的枚举,它只是Value1Pick a good book,它会告诉你更多。
  • 人们喜欢假设某人是新手或阅读障碍,因为他们有一个问题,这是怎么回事。就像我手边没有三本 C++ 书籍一样。感谢那。回到问题,为什么这种语法是可以接受的?究竟什么是“常规枚举”?有不同类型的枚举吗?
  • 什么,你的 3 本书没有告诉你范围和非范围枚举?
  • 曾经尝试搜索不认识的单词?就像你怎么称呼你喉咙后面的那个东西。书太多,搜索能力太少。但是谢谢你的术语。
  • 好吧,一本书可能无法搜索,but the internet is(先打谷歌,你可以查)。你问我为什么认为你是新手?因为您犯了一个基本的语法错误,并且没有在 online 中搜索您误用的结构的正确用法。这是新手的错误。所以你可以免去你的愤慨,我的cmets并非完全没有根据。

标签: c++ enums


【解决方案1】:

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

set[0] = Parent::Value1;

如果您想强制限定,可以使用强类型枚举。它看起来像这样:

enum struct MyEnum {
    Value1,
    Value2,
    Value3
};

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

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

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

【讨论】:

    【解决方案2】:

    enumclass 一样,定义了一个范围。像您使用的常规枚举将其枚举器名称放在其自己的范围和包含范围内。 由于这是范围解析,而不是成员访问权限,因此您使用 :: 而不是 .。因此,您可以使用Parent::Value1Value1(因为Parentpublicprotected 名称在Child 中可见),或者Parent::MyEnum::Value1MyEnum::Value1

    如果您想禁止前两个选项,您应该使用enum class 而不是只使用enum

    【讨论】:

    • 只有作用域枚举定义作用域。这就是为什么它们被添加到语言中。对于无范围的枚举,MyEnum::Value1 仅作为 MSVC 上的扩展。
    • @StoryTeller 我没有找到任何允许它的东西,但它是 works in gccclang-std=c++11 -Wall -Wextra -pedantic。如果不包含 -std 标志,clang 表示它来自 C++11。
    • @StoryTeller 根据最后一个示例here 中的代码注释,这是可行的。我还没有看过标准,但它符合我的编译器所说的,所以我暂时相信它。
    • 有趣的事实。它从 C++03 更改为 C++11,当时只有 MSVC 确实支持它作为扩展。我混淆了我的标准。有一个 +1。
    猜你喜欢
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2018-01-09
    相关资源
    最近更新 更多