【问题标题】:Overlapping header inclusions重叠的标头包含
【发布时间】:2014-01-14 13:25:44
【问题描述】:

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

我基本上有两个类 [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++ 不支持默认整数

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

【问题讨论】:

  • 看起来您在其中一个标题中有错误。我们需要看一些代码。
  • 像这样的循环依赖是糟糕设计的主要标志。

标签: c++ class header include


【解决方案1】:

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

class B;

B.h 反之亦然。

您目前遇到问题的原因是因为A.h 中有一个B*,所以它包含B.h,而B.h 有一个A*,所以它包含A.h。但是,include 保护会阻止 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。这会给你一个错误。

【讨论】:

  • 哦!这解决了它。非常感谢,你介意给我一些解释为什么我必须这样做的材料吗?再次感谢您。
  • @AndyCarter 我试图在我的回答中给出解释。希望它有所帮助。
  • 啊,这很有意义。谢谢 - 我真的很感激。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2014-11-29
  • 2016-10-13
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多