我有一个问题:假设我有一个标题/源文件集和标题集如下“
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作为我的编译器
答案 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)
您想学习如何转发声明类和结构。
答案 3 :(得分:0)
只是为了添加提及前向声明的答案,还有另一种略有不同的选择,它被称为PIMPL,它代表指向IMPlementation的指针。它通常与前向声明一起使用,但可以不使用。它不仅有助于解决循环依赖问题,而且还可以显着加快构建时间并减少代码依赖性。
答案 4 :(得分:0)
一旦我遇到类似的问题,用模板解决它。你不能将EventTypes和/或BaseCharacter定义为模板吗?