3 回答
TA贡献1820条经验 获得超10个赞
前向声明方法几乎总是更好。(我想不出包含可以使用前向声明的文件更好的情况,但我不会说总是最好以防万一)。
前向声明类没有任何缺点,但是我可以想到一些不必要的包含标头的缺点:
编译时间更长,因为包括在内的所有翻译单元
C.h
也都将包含A.h
,尽管他们可能不需要。可能包括您不需要间接使用的其他标头
用不需要的符号污染翻译单元
您可能需要重新编译包含该标头(如果更改)的源文件(@PeterWood)
TA贡献1752条经验 获得超4个赞
是的,使用前向声明总是更好。
他们提供的一些优势是:
减少编译时间。
没有名称空间污染。
(在某些情况下)可能会减小生成的二进制文件的大小。
重新编译时间可以大大减少。
避免潜在的预处理程序名称冲突。
因此,实现PIMPL成语提供了一种从接口隐藏实现的方法。
但是,向前声明一个类会使该特定类成为不完整类型,并且严格地限制了您可以对不完整类型执行的操作。
您无法执行需要编译器知道类布局的任何操作。
使用不完整类型,您可以:
声明一个成员是对不完整类型的指针或引用。
声明接受/返回不完整类型的函数或方法。
定义接受/返回不完整类型的指针或引用的函数或方法(但不使用其成员)。
使用不完整类型,您不能:
将其用作基类。
用它声明一个成员。
使用此类型定义函数或方法。
TA贡献1887条经验 获得超5个赞
有什么理由不这样做吗?
方便。
如果您提前知道该头文件的任何用户一定也需要包括A做任何事情的定义(或者可能大多数时候)。然后,将其一劳永逸地包含进去很方便。
这是一个相当棘手的主题,因为过于宽松地使用此经验法则将产生几乎无法编译的代码。请注意,Boost通过提供特定的“便利”标头以不同的方式解决该问题,该标头将几个紧密的功能捆绑在一起。
- 3 回答
- 0 关注
- 462 浏览
添加回答
举报