C++中的相互包含.它是如何工作的

Mutual include in C++ .. how does it work?

本文关键字:何工作 工作 包含 C++      更新时间:2023-10-16

可能重复:
当存在循环依赖关系时,#include的正确方式?

我对C++还很陌生,标题中有人问我这个问题。或者更准确地说:如果A.h包括B.h,B.h包括A.h,我会收到一条错误消息,因为"include#file"C:。。。\A.h"包括自身"。文件:B.h

我找不到解决这个问题的方法,我的一般设置几乎需要这些类之间的关系。有没有可能做到这一点?

在头文件中使用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的包含。

也只将声明放在头文件中。

在头文件中不惜一切代价避免定义。

简单:不要让A.h包含B.h,反之亦然。

通常,头文件应该包含尽可能少的内容。您可以使用forward声明来绕过许多include。唯一必须在标头中包含某些内容的情况是,该标头中有用作非引用的对象。

所以不要那样做。使用Pimpl可以避免将类成员放入标头中。除非是模板代码或需要内联支持,否则不要在头中编写实际代码。

最糟糕的情况是,您需要创建一个C.h来定义a.h和B.h的需求。

您没有说明这些相互依赖关系是什么,所以这些只是猜测。在所有这些中,我假设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的前向声明。

您应该始终使用某种一次性包含保护,以防止标头被多次包含。

假设在每个头中都有一个类,可以这样做:

头文件:"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"班的故事一样。通过这种方式,可以避免包含无限循环。

您有一个循环依赖项。可以使用Include Guards解决此问题。

尝试添加标头保护,

#ifndef _A_H_
#define _A_H_
...
..
.
#endif /* #ifndef _A_H_ */

您永远不应该包含两次头文件,这会导致重新定义。。

当头文件被添加到文件中时,它会在编译的预处理部分被包括在内。所以把B.h包含在A.h中,把A.h包含在B.h中。这是一种无限递归的方法,文件会被多次包含。

将B.h包括在A.h中等于A.h<-B.h将A.h包括在B.h中等于Bh<-A.h

所以它是无限递归循环之王。