【问题标题】:C++ cyclical header dependencyC++ 循环头文件依赖
【发布时间】:2011-07-11 12:41:57
【问题描述】:

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

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 作为我的编译器

【问题讨论】:

  • 循环标头和前向声明已在 SO 上多次介绍。只需查看右侧的“相关”部分,您就会找到答案。

标签: c++ header


【解决方案1】:

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

请看这里:cyclic dependency between header files

或在这里:C++ error: 'Line2' has not been declared

【讨论】:

    【解决方案2】:

    转发声明。

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

    class BaseCharacter;

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        除了提到前向声明的答案之外,还有另一种略有不同的替代方法,它称为 PIMPL,代表指向 IMPlementation 的指针。它通常与前向声明一起使用,但也可以不使用。不仅有助于解决循环依赖问题,还可以显着加快构建时间,减少代码依赖。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2015-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-06
            • 2011-06-16
            相关资源
            最近更新 更多