重叠的标题包含

And*_*ter 1 c++ header class include

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

我基本上有两个类 [A & B](每个 .cpp 文件中的一个,带有自己的 .h)。

A.h #includes the contents from B.h

B.h #includes the contents from A.h
Run Code Online (Sandbox Code Playgroud)

我已经包含了一个标头保护,但是,如果我尝试声明 A 或 B 类型的任何指针或对象,我会收到以下错误:

错误 1 ​​错误 C2061:语法错误:标识符“B”

错误 3 错误 C2143:语法错误:缺少“;” 前 '*'

错误 4 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

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

Jos*_*eld 5

如果你只需要指针,你只需要一个前向声明。无需在彼此中包含标头,只需向前声明您需要指向的类即可。例如,在 中A.h,您应该具有:

class B;
Run Code Online (Sandbox Code Playgroud)

反之亦然B.h

您目前遇到问题的原因是因为里面A.h有 a B*,所以它包括B.h,并且B.hA*,所以它包括A.h。但是,包含保护会阻止A.h再次包含的内容,因此B无法编译。

我们举一个简单的例子。这是A.h

#ifndef A_H
#define A_H
#include "B.h"

class A {
  B* b;
};
#endif
Run Code Online (Sandbox Code Playgroud)

这是B.h

#ifndef B_H
#define B_H
#include "A.h"

class B {
  A* a;
};
#endif
Run Code Online (Sandbox Code Playgroud)

所以假设我们正在编译A.h. 首先我们检查包含守卫,它通过了。然后我们 include B.h,它也有一个包含守卫通过,所以让我们展示一下包含:

#include "A.h"

class B {
  A* a;
};

class A {
  B* b;
};
Run Code Online (Sandbox Code Playgroud)

现在这B.h包含了A.h,但是包含守卫A.h不会再次通过,所以包含没有带来任何东西。我们最终的预处理文件看起来像:

class B {
  A* a;
};

class A {
  B* b;
};
Run Code Online (Sandbox Code Playgroud)

现在看看 的定义B。它有一个A*,但A尚未宣布。这会给你一个错误。