有一种方法可以修复它,但这也意味着你的班级组织被破坏了。
修复它的方法称为“包含保护”,尽管许多编译器也支持该#pragma once
指令。我想它不起作用,因为#pragma once
在解析整个内容之前可能不会考虑包含头文件。而且由于递归包含发生在头文件的中间,它还没有完成解析。
包含守卫是这样的:
在 ClassA.h 中:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSA_H
#define INCLUDED_CLASSA_H
#include "ClassB.h"
//... rest of header file
#endif
在 ClassB.h 中:
#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSB_H
#define INCLUDED_CLASSB_H
#include "ClassA.h"
//... rest of header file
#endif
组织问题被称为循环依赖,循环依赖通常是个坏主意。有许多不同的方法可以打破它们,但使用哪种方法取决于依赖的确切性质和最初的原因。
根据问题,您可以使用多种技术之一:
- 从公共基类继承
- 将两个类中的一个转换为另一个的基类- 这是前一个的变体。
- 前向声明 - 这不是那么理想,因为它并没有真正打破循环依赖,它只是安排它,所以你不需要也有一个有问题的循环包含依赖。
- 将两个类的某些部分变成一个它们都可以使用的类- 这是通用基类的另一种变体,它使用组合而不是继承。
还有其他技术。事实上,有一本书在各种情况下使用了非常广泛的技术,因为消除循环依赖是这本书的一个重要主题。那本书是John Lakos 的“Large-Scale C++ Software Design”。