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

时间:2012-05-06 09:35:36

标签: c++ header-files forward-declaration

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:11)

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

以下是Google的理由:Header File Dependencies

答案 1 :(得分:4)

当你使用前向声明时,你明确地说它“B类不需要知道关于A类内部实现的任何内容,它只需要知道名为A的类存在”如果你可以避免包含那个标题,那就避免使用它。 - 最好使用正向声明,因为你通过使用它来消除冗余依赖。

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

这些问题也可以帮助您:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?

答案 2 :(得分:0)

请勿尝试使编译高效。有龙。只需在A.hpp中加入B.hpp

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

#ifdef _A_HPP_
#define _A_HPP_

// all your definitions

#endif

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