可能重复:
Proper way to #include when there is a circular dependency?
我对C ++很陌生,并在标题中提出了问题。或者更确切地说:如果A.h包含B.h而B.h包含A.h,则会收到错误消息,因为“包含#file”C:... \ A.h“包含自身”。档案:B.h
我找不到解决这个问题的方法,而我的常规设置几乎要求这些类之间的关系。 是否有可能使这项工作?
答案 0 :(得分:7)
在头文件中使用Include警卫。 http://en.wikipedia.org/wiki/Include_guard
#ifndef MYHEADER_H
#define MYHEADER_H
//add decls here
#endif
这样,如果您的头文件被多次包含,编译器会忽略它们。
另外,根据经验,如果你包括A.h的B.h,最好将A.h和B.h包括在你的应用程序中,而不是依赖于B.h.的包含。
也只在头文件中放置声明。
在头文件中不惜一切代价避免使用定义。
答案 1 :(得分:6)
简单:不要让A.h包括B.h.反之亦然。
通常,头文件应尽可能少地包含。您可以使用前向声明来绕过很多包含。您绝对必须在标题中包含某些内容的唯一情况是,是否有在该标题中用作非引用的对象。
所以避免这样做。使用Pimpl避免将类成员放入标题中。除非它是模板代码或者您需要内联支持,否则不要在标题中写入实际代码。
最糟糕的情况是你需要创建一个C.h来定义A.h和B.h需要的东西。
答案 2 :(得分:1)
你没有说那些相互依赖是什么,所以这些只是猜测。在所有这些中,我假设A.h定义class A
和B.h定义class B
。
案例1 :相互依赖是通过指针或引用
例如,class A
包含类型B*
的数据成员,反之亦然。在这种情况下,标题不需要#include
另一个。改为使用转发声明。
案例2 :相互依赖是通过对象
例如,class A
包含类型B
的数据成员,反之亦然。在这种情况下,你被软管了。
案例3 :混合依赖。
例如,class A
包含B
类型的数据成员,但class B
包含类型为A*
的数据成员。现在A.h确实需要#include B.h
,但B.h只需要class A
的前瞻声明。
您应该始终使用某种一次性包含警示来防止多次包含标题。
答案 3 :(得分:1)
假设在每个标题中你有一个类,你可以这样做:
标题文件:“A.h”
#ifndef A_H
#define A_H
Class B;
Class A {
public:
B name_of_B_;
}
#endif
使用#ifndef A_H #define A_H #endif
,您可以确保每个标头只包含一次。您应该在几乎所有生成的头文件中使用它,而不仅仅是在这种双重包含的特殊情况下。使用Class B;
,您将声明某个名为“B”的类将被定义。
Class B {
public:
A name_of_A_;
}
#endif
与“B”类相同的故事。这样就可以避免包含无限循环。
答案 4 :(得分:0)
你有Circular Dependency。它可以使用Include Guards来解决。
答案 5 :(得分:0)
尝试添加标题保护,
#ifndef _A_H_
#define _A_H_
...
..
.
#endif /* #ifndef _A_H_ */
你永远不应该包括两次头文件,导致重新定义..
答案 6 :(得分:0)
当头文件添加到文件时,它会在编译的预处理部分中包含。因此将B.h纳入A.h.并且包括A.h在B.h.它是无限递归的,文件被多次包含。
在A.h中包括B.h相当于 A.h&lt; - B.h 在B.h中包括A.h相当于 Bh < - A.h
所以它是无限递归循环之王。