【问题标题】:Forward declared enum as class member variable将声明的枚举转发为类成员变量
【发布时间】:2020-04-10 07:57:23
【问题描述】:

作为前向声明的经验法则(来自“API Design for C++”,第 214 页),我只包含类的标题,如果我:

  • 在我自己的类中使用该类的对象作为数据成员,或者
  • 从该类继承

在所有其他情况下,我只是转发声明类。

但是,我最近偶然使用了一个前向声明的枚举类作为类的数据成员,并且它被编译了。

这确实可以使用,还是只是一个意外的 hack(我实际上需要带有 MyEnum 定义的标题)?

// test.hpp
enum class MyEnum;

class A {
    MyEnum myenum;
};

【问题讨论】:

    标签: c++ forward-declaration enum-class


    【解决方案1】:

    前向声明的枚举类具有指定的基础类型。如果未明确指定,则为int。因为枚举的存储大小是已知的,即使它只是前向声明的,所以将它用作成员也不成问题。

    【讨论】:

    • 但是如果实际的枚举定义具有指定的类型(或者在我在文件中前向声明枚举之后更改),例如enum class MyEnum: char { VAL1, VAL2 }; 这还可以吗?
    • 这是不允许的。如果前向声明中未指定类型,则为int
    • 因此,如果最初未在定义中指定类型,则一切正常。如果稍后有人将定义中的枚举类型指定为char,她会得到编译错误吗?此外,是否需要更改所有前向声明以同时指定底层枚举类型?
    • 是的。 Live example.
    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多