C ++循环标头依赖

时间:2011-03-09 00:11:12

标签: c++ header

我有一个问题:假设我有一个标题/源文件集和标题集如下“

BaseCharacter.h和BaseCharacter.cpp和EventTypes.h

BaseCharacter.h使用EventTypes.h中定义的结构和typedef,但EventTypes.h必须知道BaseCharacter.h中定义的BaseCharacter类。这创造了一个周期性的依赖,我很确定这是什么阻止我的程序编译。如果我拿出EventTypes.h以及所有依赖于EventTypes.h中的东西的方法,我的程序编译得很好。但是如果我添加了EventTypes.h,那么引用BaseCharacter.h的每个文件都会抱怨它找不到BaseCharacter类。

是否有办法绕过这种依赖,或者这不是导致我的问题的原因?

我正在使用MSVC 2010作为我的编译器

5 个答案:

答案 0 :(得分:4)

前瞻性声明。

在EventTypes.h中,删除包含并添加:

class BaseCharacter;

请注意,您只能在EventTypes.h中使用BaseCharacter的引用和指针,但不能使用有一个带BaseCharacter myChar;成员变量的结构。

答案 1 :(得分:1)

你应该好好看看你的设计并确保它有意义;通常,周期性依赖性表明次优设计(尽管它可能是满足您需求的最佳解决方案)。

在任何情况下,您都可以预先在每个头文件中预先声明类,从而避免使用循环包含。这是使用forward declarations调用的。

另一个好的选择是将BaseCharacter.h和EventTypes.h所依赖的东西提取到前两个包含的第三个头文件中;那么你在BaseCharacter.h上只有EventTypes.h的单向依赖。

第三种方法是简单地将所有内容合并到一个头文件中;根据您的设计,这可能有意义也可能没有意义,但如果相互依赖性足够强,那么统一模型肯定有意义吗?

答案 2 :(得分:0)

您想学习如何转发声明类和结构。

见这里:cyclic dependency between header files

或此处:C++ error: 'Line2' has not been declared

答案 3 :(得分:0)

只是为了添加提及前向声明的答案,还有另一种略有不同的选择,它被称为PIMPL,它代表指向IMPlementation的指针。它通常与前向声明一起使用,但可以不使用。它不仅有助于解决循环依赖问题,而且还可以显着加快构建时间并减少代码依赖性。

答案 4 :(得分:0)

一旦我遇到类似的问题,用模板解决它。你不能将EventTypes和/或BaseCharacter定义为模板吗?