为了账号安全,请及时绑定邮箱和手机立即绑定

一个人应该使用前向声明而不是包含吗?

一个人应该使用前向声明而不是包含吗?

C++
慕斯709654 2019-11-25 14:10:08
每当一个类声明仅将另一个类用作指针时,使用一个类正向声明而不是包括头文件是否有意义,以抢先避免循环依赖问题?因此,与其具有://file C.h#include "A.h"#include "B.h"class C{    A* a;    B b;    ...};改为这样做://file C.h#include "B.h"class A;class C{    A* a;    B b;    ...};//file C.cpp#include "C.h"#include "A.h"...有什么理由不这样做吗?C ++ 前向声明
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

前向声明方法几乎总是更好。(我想不出包含可以使用前向声明的文件更好的情况,但我不会说总是最好以防万一)。

前向声明类没有任何缺点,但是我可以想到一些不必要的包含标头的缺点:

  • 编译时间更长,因为包括在内的所有翻译单元C.h也都将包含A.h,尽管他们可能不需要。

  • 可能包括您不需要间接使用的其他标头

  • 用不需要的符号污染翻译单元

  • 您可能需要重新编译包含该标头(如果更改)的源文件(@PeterWood)


查看完整回答
反对 回复 2019-11-25
?
温温酱

TA贡献1752条经验 获得超4个赞

是的,使用前向声明总是更好。

他们提供的一些优势是:

  • 减少编译时间。

  • 没有名称空间污染。

  • (在某些情况下)可能会减小生成的二进制文件的大小。

  • 重新编译时间可以大大减少。

  • 避免潜在的预处理程序名称冲突。

  • 因此,实现PIMPL成语提供了一种从接口隐藏实现的方法。

但是,向前声明一个类会使该特定类成为不完整类型,并且严格地限制了您可以对不完整类型执行的操作。
您无法执行需要编译器知道类布局的任何操作。

使用不完整类型,您可以:

  • 声明一个成员是对不完整类型的指针或引用。

  • 声明接受/返回不完整类型的函数或方法。

  • 定义接受/返回不完整类型的指针或引用的函数或方法(但不使用其成员)。

使用不完整类型,您不能:

  • 将其用作基类。

  • 用它声明一个成员。

  • 使用此类型定义函数或方法。


查看完整回答
反对 回复 2019-11-25
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

有什么理由不这样做吗?


方便。


如果您提前知道该头文件的任何用户一定也需要包括A做任何事情的定义(或者可能大多数时候)。然后,将其一劳永逸地包含进去很方便。


这是一个相当棘手的主题,因为过于宽松地使用此经验法则将产生几乎无法编译的代码。请注意,Boost通过提供特定的“便利”标头以不同的方式解决该问题,该标头将几个紧密的功能捆绑在一起。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 462 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信