假设我有一个 A 类和一个 B 类。
A 的 .h 需要 B 的 .h,B 的 .h 需要 A 的 .h。(need = #include)。
所有 .h 都有警卫:
#ifndef _classX_
#define _classX_
...
...
#endif
但是如果我编译A的.cpp,那么当它包含B的.h时,B类不能包含A类的.h,因为A类已经使用了防护。
我该如何解决这个问题?
您将需要其中一个类的前向声明。
// a.h
// do not #include b.h
class B; // forward declaration
class A {
....
B * b;
};
请注意,A 类不能包含实际的 B 实例——它必须是指针或引用。您也不能通过头文件中的 B 指针调用任何函数 - 它们必须进入一个包含两个头文件的 .cpp 源文件。
其中一个需要绕过而不包括它。在许多情况下,这是可能的,您可以将#include 移动到 .cpp 文件中
class A {
// no need for header of B here
void f(B b);
// no need for header of B here either
B *b;
};
通常对于定义在 .cpp 文件中的函数声明,您不需要在标头中添加任何 #include。对于类成员,如果您想将它们作为值对象嵌入,则只需要标题。在这种情况下,您需要将它们更改为指针(或智能指针)和new
.cpp 文件中的它们。为了让编译器知道B
我上面的例子中的内容,你只需要在定义之前放置一个前向声明,A
如下所示:
class B;