C++中的相互包含.它是如何工作的
Mutual include in C++ .. how does it work?
可能重复:
当存在循环依赖关系时,#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
所以它是无限递归循环之王。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?