我遇到了一个我需要帮助的简单问题。
我基本上有两个班级[A& B](每个.cpp文件中有一个带有自己的.h)。
A.h #includes the contents from B.h
B.h #includes the contents from A.h
我已经包含了一个标头保护,但是,如果我尝试声明任何类型A或B的指针或对象,我会收到以下错误:
错误1错误C2061:语法错误:标识符'B'
错误3错误C2143:语法错误:缺少';'在'*'之前
错误4错误C4430:缺少类型说明符 - 假定为int。注意:C ++ 不支持default-int
有什么办法吗?声明在那里 - 我只是不知道它为什么不接受它。
答案 0 :(得分:4)
如果您只需要指针,则只需要一个前向声明。不要将标题相互包含在内,只需向前声明需要指针的类。例如,在A.h
中,您应该:
class B;
反之亦然B.h
。
您目前遇到问题的原因是因为A.h
中包含B*
,因此它包含B.h
,B.h
有A*
,所以它包括A.h
。但是,include guard会阻止再次包含A.h
的内容,因此B
无法编译。
我们举一个简单的例子。这是A.h
:
#ifndef A_H
#define A_H
#include "B.h"
class A {
B* b;
};
#endif
这是B.h
:
#ifndef B_H
#define B_H
#include "A.h"
class B {
A* a;
};
#endif
所以我们假设我们正在编译A.h
。首先,我们检查包含防护,通过。然后我们包含B.h
,它也有一个包含守卫,所以让我们展示包含:
#include "A.h"
class B {
A* a;
};
class A {
B* b;
};
现在这个B.h
包含A.h
,但A.h
中的包含守卫不会再次传递,因此包含不会带来任何内容。我们的最终预处理文件如下所示:
class B {
A* a;
};
class A {
B* b;
};
现在看看B
的定义。它中有一个A*
,但尚未声明A
。这会给你一个错误。