【问题标题】:Scoped enumerations范围枚举
【发布时间】:2014-06-29 16:12:10
【问题描述】:

我正在开发一个简单的 Breakout 克隆来练习我刚刚起步的 C++ 技能。游戏的资源是一个名为“资源”的类的子类,该类由一个用于识别资源类型的 ID 和一些虚拟函数组成。到目前为止,这个类看起来像这样:

class Resource {
private:
    int _id;
protected:
    enum ResourceType {
        TEXT
        , PADDLE
        , BALL
        , BRICK
    };
public:
    Resource(int resourceID) : _id{resourceID} {}
};

但是,为了让自己熟悉 C++11,我想切换到作用域枚举。我确定我在这里遗漏了一些东西(毕竟代码不会编译!)。错误修改代码如下:

class Resource {
private:
    ResourceType _id;
protected:
    enum class ResourceType : int {
        TEXT = 0
        , PADDLE
        , BALL
        , BRICK
    };
public:
    Resource(ResourceType resourceID) : _id{resourceID} {}
};

鉴于我收到的编译器错误(ResourceType _id; 行中的“错误:'ResourceType' 没有命名类型”),看来我可能需要在其他地方对我的枚举类进行原型制作,但我的尝试已经徒然。请指教!

【问题讨论】:

  • 这与 C++11 无关。原来的代码已经被破坏了,因为它应该在那里说ResourceType _id
  • 啊 - 好抓;编译,但格式不正确。

标签: c++ c++11 enums


【解决方案1】:

您只需要在使用它之前声明类型,如下所示:

class Resource {
protected:
    enum class ResourceType : int {
        TEXT = 0
        , PADDLE
        , BALL
        , BRICK
    };
private:
    ResourceType _id;
public:
    Resource(ResourceType resourceID) : _id{ resourceID } {}
};

【讨论】:

  • 像魅力一样工作。不知道为什么我没有考虑简单地移动那段代码而不是尝试使用原型——回想起来有点傻!
  • @Nate 我认为您的意思是“前向声明”; “原型”更模糊,更历史,并且在 C++ 中没有被广泛使用。
  • @LightnessRacesinOrbit 你是对的 - 我想这就是你通过互联网资源自学语言时会发生的事情。感谢您的提醒。
  • @Nate:是的,是的! :)
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多