前向声明/何时最好包含标题?

Hol*_*lly 6 c++ header-files forward-declaration

我很清楚何时能够/不能使用前瞻性声明,但我仍然不确定一件事.

假设我知道我迟早要包括一个标题来取消引用A类的对象.我不清楚是否更有效地做类似的事情.

class A;
class B
{
   A* a;
   void DoSomethingWithA();
};
Run Code Online (Sandbox Code Playgroud)

然后在cpp有类似的东西..

#include "A.hpp"
void B::DoSomethingWithA()
{
   a->FunctionOfA();
}
Run Code Online (Sandbox Code Playgroud)

或者我也可以首先在B的头文件中包含A的标题?如果前者效率更高,那么如果有人清楚地解释了为什么我怀疑它与编译过程有关,我可以随时了解更多信息,我会很感激.

iro*_*bot 11

尽可能使用前向声明(如您的示例中所示).这减少了编译时间,但更重要的是,最小化了不需要知道且不关心实现细节的代码的头和库依赖性.通常,除实际实现之外的任何代码都不应关心实现细节.

以下是Google的理由:头文件依赖关系

  • 我知道这个帖子已经老了,但我想我应该指出,以防其他人在寻找理由,谷歌的理由似乎已经改为"尽可能避免使用前向声明.只需#include你需要的标题." (12认同)

Lih*_*ihO 5

当你使用前向声明时,你明确地说“B 类不需要知道 A 类的内部实现,它只需要知道名为 A 的类存在”如果您可以避免包含该标题,请避免使用它。- 使用前向声明是一种很好的做法,因为您可以通过使用它来消除多余的依赖项。

另请注意,当您更改头文件时,会导致重新编译包含它的所有文件。

这些问题也会对您有所帮助:
前向申报的缺点是什么?
提前申报的目的是什么?