7

我很清楚何时可以/不能使用前向声明,但我仍然不确定一件事。

假设我知道我迟早必须包含一个标头来取消引用 A 类的对象。我不清楚做类似的事情是否更有效。

class A;
class B
{
   A* a;
   void DoSomethingWithA();
};

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

#include "A.hpp"
void B::DoSomethingWithA()
{
   a->FunctionOfA();
}

或者我也可以首先在 B 的头文件中包含 A 的头文件?如果前者效率更高,那么如果有人清楚地解释为什么我怀疑它与编译过程有关,我将不胜感激。

4

3 回答 3

12

尽可能使用前向声明(如您的示例)。这减少了编译时间,但更重要的是最大限度地减少了不需要知道也不关心实现细节的代码的头文件和库依赖关系。一般来说,除了实际实现之外,没有任何代码应该关心实现细节。

这是谷歌对此的理由:头文件依赖

于 2012-05-06T09:56:47.493 回答
5

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

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

这些问题也将对您有所帮助:
前向声明的缺点是什么?
前向声明的目的是什么?

于 2012-05-06T09:52:52.347 回答
0

不要试图让你的编译高效。有龙。只需包含A.hppB.hpp.

C 和 C++ 头文件的标准做法是将所有头文件包装在 an#ifndef中,以确保它只编译一次:

#ifndef _A_HPP_
#define _A_HPP_

// all your definitions

#endif

这样,如果您#include "A.hpp"在 中B.hpp,您可以拥有一个包含两者的程序,并且它不会中断,因为它不会尝试定义任何东西两次。

于 2012-05-06T09:49:49.273 回答