我正在使用#pragma一次,而不是#include守卫我的所有h文件。如果a.h需要#include b.h并且b.h需要#include a.h?
,我该怎么办?如果出现错误,我会得到各种各样的错误,因为通过这样做,pragma一旦生效,其中一个就会相互错过。我该怎么办呢。
由于
答案 0 :(得分:4)
您需要转发声明所需的定义。因此,如果A使用B作为参数值,则需要转发声明B,反之亦然。
可能只是向前声明类名:
class A;
class B;
解决您的问题。
this question的已接受答案提供了一些额外的指导。
答案 1 :(得分:2)
一种可能性是将文件a.h
和b.h
的某些部分重构为第三个文件c.h
,并将其a.h
和{{1}包括在内}。这样,后两者将不再需要相互包含。
另一种可能性是将单独的头文件合并为一个。
第三种可能性是两个类合法地需要相互引用的情况。在这种情况下,你必须使用指针。此外,您可以转发声明类而不是包含其头文件。 [由jdv提及]例如,
b.h
但是,如果不了解您的具体情况,很难提供具体的建议。
答案 2 :(得分:0)
这取决于彼此的头文件需要什么。如果它是一个类定义,但它只是使用指向该类的指针,那么而不是包含头文件只是放入一个前向声明,如:
class MyClassA;
答案 3 :(得分:0)
此问题的解决方案是“前向声明”。
如果你有一个需要在2个头文件中使用的类或函数,其中一个头需要转发声明所使用的类或类型。 或者您需要考虑重新构建标题。
这是一个常见的初学者问题,循环依赖会导致此类问题。如果你谷歌'前向声明'会发现大量的结果。
由于你的问题太不明确,我无法给你一个确切的答案,对不起。
答案 4 :(得分:0)
您不能使用不完整的类型,但您可以直接声明它们。你只需告诉编译器:“不要语法错误,我知道我在做什么”。这意味着链接器将从库中找到完整的类型。