我很清楚何时可以/不能使用前向声明,但我仍然不确定一件事。
假设我知道我迟早必须包含一个标头才能取消引用 A 类的对象。 我不清楚做类似的事情是否更有效..
class A;
class B
{
A* a;
void DoSomethingWithA();
};
然后在 cpp 中有类似的东西..
#include "A.hpp"
void B::DoSomethingWithA()
{
a->FunctionOfA();
}
或者我是否可以首先将 A 的头文件包含在 B 的头文件中? 如果前者更有效,那么如果有人清楚地解释原因,我将不胜感激,因为我怀疑它与编译过程有关,我总是可以通过了解更多信息来做到这一点。
尽可能使用前向声明(如您的示例中所示)。这减少了编译时间,但更重要的是最大限度地减少了不需要知道也不关心实现细节的代码的头文件和库依赖性。一般来说,除了实际实现之外,任何代码都不应该关心实现细节。
这是 Google 对此的基本原理:头文件依赖关系
编译高效。那里有龙。只需将 A.hpp
包含在
B.hpp
中即可。C 和 C++ 头文件的标准做法是将所有头文件包装在
#ifndef
中,以确保它只编译一次:
#ifndef _A_HPP_
#define _A_HPP_
// all your definitions
#endif
这样,如果您在
#include "A.hpp"
中
B.hpp
,您就可以拥有一个包含两者的程序,并且它不会中断,因为它不会尝试两次定义任何内容。