假设我有一个A类和一个B类。
A的.h需要B的.h,B的.h需要A的.h。(需要= #include)。
所有.h都有警卫:
#ifndef _classX_
#define _classX_
...
...
#endif
但是如果我编译A的.cpp,那么当它包含B的.h时,B类不能包含A类的.h,因为A类已经使用了守卫。
我该如何解决这个问题?
答案 0 :(得分:5)
您需要其中一个类的前向声明。
// a.h
// do not #include b.h
class B; // forward declaration
class A {
....
B * b;
};
请注意,A类不能包含实际的B实例 - 它必须是指针或引用。你也不能通过标题中的B指针调用任何函数 - 它们必须进入.cpp源文件,其中#includes两个标题。
答案 1 :(得分:3)
他们中的一个需要绕开而不包括它。对于许多情况,这是可能的,您可以将#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文件中的函数声明,标题中不需要任何#includes。对于类成员,如果要将它们作为嵌入的值对象使用,则只需要标题。在这种情况下,你需要在.cpp文件中将它们更改为指针(或智能指针)和new
。为了让编译器知道上面例子中B
是什么,你只需要在A
的定义之前放一个前向声明:
class B;