前向声明/何时最好包含标头? [重复]

问题描述 投票:0回答:3

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

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

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

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

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

或者我是否可以首先将 A 的头文件包含在 B 的头文件中? 如果前者更有效,那么如果有人清楚地解释原因,我将不胜感激,因为我怀疑它与编译过程有关,我总是可以通过了解更多信息来做到这一点。

c++ header-files forward-declaration
3个回答
12
投票

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

这是 Google 对此的基本原理:头文件依赖关系


5
投票

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

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

这些问题也会对您有帮助:


前向声明有哪些缺点?
前向声明的目的是什么?


0
投票
不要试图让你的

编译高效。那里有龙。只需将 A.hpp

 包含在 
B.hpp
 中即可。

C 和 C++ 头文件的标准做法是将所有头文件包装在

#ifndef

 中,以确保它只编译一次:

#ifndef _A_HPP_ #define _A_HPP_ // all your definitions #endif

这样,如果您在

#include "A.hpp"

B.hpp
,您就可以拥有一个包含两者的程序,并且它不会中断,因为它不会尝试两次定义任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.