有一种方法可以解决它,但这也意味着你的班级组织已经坏了。
解决它的方法被称为“包括警卫,虽然很多编译器还支持#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
组织问题被称为循环依赖,以及循环依赖通常是一个坏主意。有很多不同的方法可以打破它们,但是要使用哪种方法取决于依赖关系的确切性质和原始原因。
根据不同的问题,你可以使用各种技术之一:
从公共基类
谈到这两个类中的一个成一个基类为其他
- 继承 - 这是前一个的变体。
- 正向声明 - 这是不希望这样,因为它并没有真正打破循环依赖,它只是安排,所以你并不需要也有一个问题圆形包括依赖性。
- 车削两个类的某些部分成一类,它们都可以使用- 这是共同的基类的另一种变型,使用的组合物,而不是继承的。
还有其他技术。事实上,有一本书有各种各样的技术可用于各种情况,因为消除循环依赖是本书的一大主题。那本书是"Large-Scale C++ Software Design" by John Lakos。
它应该有一个连字符分开的称号,我会补充说,现在,遗憾的混乱。 – 2013-02-15 01:33:21
通常情况下,通常会包含导致问题的实际代码的代码段。它可以是一个测试用例,只要它实际上存在你所问的问题,并且你已经测试了它,以确保它只是在这里发布。之所以这样很难给出一个很好的具体答案。 – Omnifarious 2013-02-15 01:41:20