重叠的收割台夹杂物

Overlapping header inclusions

本文关键字:收割 重叠      更新时间:2023-10-16

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

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

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

如果只需要指针,则只需要前向声明。与其将头包含在彼此中,不如简单地向前声明需要指针指向的类。例如,在A.h中,您应该有:

class B;

在CCD_ 2中反之亦然。

您当前出现问题的原因是,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中的include保护不会再次通过,所以include不会带来任何内容

class B {
A* a;
};
class A {
B* b;
};

现在来看B的定义。它有一个A*,但B.h0尚未声明。这会给你一个错误。