当存在循环依赖时,#include的正确方法是什么?

时间:2010-10-10 18:33:07

标签: c++

我正在使用#pragma一次,而不是#include守卫我的所有h文件。如果a.h需要#include b.h并且b.h需要#include a.h?

,我该怎么办?

如果出现错误,我会得到各种各样的错误,因为通过这样做,pragma一旦生效,其中一个就会相互错过。我该怎么办呢。

由于

5 个答案:

答案 0 :(得分:4)

您需要转发声明所需的定义。因此,如果A使用B作为参数值,则需要转发声明B,反之亦然。

可能只是向前声明类名:

 class A;
 class B;

解决您的问题。

this question的已接受答案提供了一些额外的指导。

答案 1 :(得分:2)

一种可能性是将文件a.hb.h的某些部分重构为第三个文件c.h,并将其a.h和{{1}包括在内}。这样,后两者将不再需要相互包含。

另一种可能性是将单独的头文件合并为一个。

第三种可能性是两个类合法地需要相互引用的情况。在这种情况下,你必须使用指针。此外,您可以转发声明类而不是包含其头文件。 [由jdv提及]例如,

b.h

但是,如果不了解您的具体情况,很难提供具体的建议。

答案 2 :(得分:0)

这取决于彼此的头文件需要什么。如果它是一个类定义,但它只是使用指向该类的指针,那么而不是包含头文件只是放入一个前向声明,如:

class MyClassA;

答案 3 :(得分:0)

此问题的解决方案是“前向声明”。

如果你有一个需要在2个头文件中使用的类或函数,其中一个头需要转发声明所使用的类或类型。 或者您需要考虑重新构建标题。

这是一个常见的初学者问题,循环依赖会导致此类问题。如果你谷歌'前向声明'会发现大量的结果。

由于你的问题太不明确,我无法给你一个确切的答案,对不起。

答案 4 :(得分:0)

您不能使用不完整的类型,但您可以直接声明它们。你只需告诉编译器:“不要语法错误,我知道我在做什么”。这意味着链接器将从库中找到完整的类型。