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