重叠头部包含

时间:2013-12-26 23:09:02

标签: c++ class header include

我遇到了一个我需要帮助的简单问题。

我基本上有两个班级[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

有什么办法吗?声明在那里 - 我只是不知道它为什么不接受它。

1 个答案:

答案 0 :(得分:4)

如果您只需要指针,则只需要一个前向声明。不要将标题相互包含在内,只需向前声明需要指针的类。例如,在A.h中,您应该:

class B;

反之亦然B.h

您目前遇到问题的原因是因为A.h中包含B*,因此它包含B.hB.hA* ,所以它包括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。这会给你一个错误。