【问题标题】:C++ is creating a header to solve circular dependency a good idea?C++ 创建一个头文件来解决循环依赖是个好主意吗?
【发布时间】:2016-07-27 15:01:30
【问题描述】:

我有一个开始变大的 C++ 项目。我面临的情况是我有很多具有循环依赖关系的类。假设我有 A、B、C、D 类。为了解决这个问题,我创建了一个名为 circular_dep.h

的头文件

这个文件的内容是指向类的指针:

class A;
class B;
class C;
class D;

这个标题现在包含在我所有课程的标题中。这样,当我有循环依赖时,编译器就不再抱怨了。但是,每当我向项目添加新类时,我都必须将其添加到 circular_dep.h

我找不到任何更简单的方法来做到这一点,所以对我来说这是迄今为止最好的解决方案。我的问题是:将其应用于可能面临循环依赖问题的项目是一个好主意吗?或者这是一个糟糕的设计/糟糕或危险的做法?

【问题讨论】:

  • 最好同时避免循环引用。您最好询问如何重新构造您的代码,以便您一开始就不需要它们。另请注意,您显示的头文件不包含 pointers 而是(转发)declarations 类。
  • 我的偏好是只在需要它们的标头中包含单个类前向引用。但这只是一种偏好。不将其全部放在一个标头中的一个原因是为了避免在添加类时必须重新编译所有内容。
  • 在我看来,有些情况可能是不可避免的。例如,我正在为一种看起来像 C 的简单语言编写编译器。函数有一个块('{' 和 '}' 之间的任何内容)。一个块有变量声明和命令(如'if'),一个命令可能有一个块('if' 可能有一个块)。因此,我们在 Command 和 Block 之间存在 circ dep 问题
  • 这些不是指向类的指针。它们是类的前向声明。当您可以在需要时自行编写前向声明时,我认为没有理由为此创建另一个头文件。

标签: c++ header-files circular-dependency


【解决方案1】:

你所拥有的一切都很好。我经常看到的命名后缀是_fwd.h/_fwd.hpp/_fwd.hxx 或者你喜欢的.h 的任何变体。您可以在 Boost 中看到这一点,例如:optional_fwd.hpp

(当然减少循环依赖是一个很好的目标,但是有些东西本质上是相互递归的,比如语法,所以你别无选择。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2014-08-15
    • 2011-07-11
    • 2018-09-30
    • 2011-09-27
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多