将声明的枚举转发为类成员变量

Posted

技术标签:

【中文标题】将声明的枚举转发为类成员变量【英文标题】: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;
;

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于将声明的枚举转发为类成员变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将静态 const 变量保留为类的成员

为啥这个 const auto 变量在 range-for 循环中为类的 const 成员函数编译?

c#中怎样定义枚举?

类加载顺序--总结版

自定义类型

java基础知识13 类变量(static)实例变量成员变量局部变量