【问题标题】:Avoid cyclic references caused by C++ includes headers [duplicate]避免由 C++ 引起的循环引用包含标头 [重复]
【发布时间】:2012-09-16 02:08:15
【问题描述】:

我有 3 个类:A、B 和 C。C 是 B 的 #includeed,B 是 A 的 #included。在 C 类中,我为按钮定义了一个处理程序,当按钮是推,C 将PostMessage 到对象A。如果我在C 中包含A,我将有一个循环引用,那么我应该怎么做才能避免这个循环引用?

编辑:所有包含都在实现文件中。

【问题讨论】:

  • 您尚未指定是否将所有这些文件包含在实现(.cc、.cpp)或标头(.h)中。看起来大多数回答者都假设你的意思是头文件。

标签: c++ include cyclic-reference


【解决方案1】:

您应该使用前向声明。由于C 不是A 的所有者,我假设您有一个指针作为成员。所以你不需要包括:

class A; //forward declaration
class C
{
    A* a;
};

在实现文件中,您将包含A.h,但这没关系。此外,如果可以,请尽可能在A.hB.h 中使用前向声明。

【讨论】:

  • 好吧,我的类/对象结构如下所示:A 实际上是一个带有tab control 的窗口,它的每个选项卡都是一个B 对象(这是另一个tabcontrol ),并且每个B 的每个选项卡都有一个C obj。 C 类有几个按钮,当我按下时,会向A 发送消息(每个按钮发送不同的消息)。所有这些,都是另一个窗口的一部分,主窗口。 C 对象没有指向A 的指针,而A 具有指向CB 的间接指针。
  • @MRM 您了解什么是前向声明并尝试使用它吗?
  • 不错。这正是我所需要的。谢谢!
【解决方案2】:

如果类 X 仅通过指针使用类 Y,则应在声明类 X 之前使用类 Y 的前向声明。

最好将前向声明保存在单独的文件中。 iosfwd is a standard example of this approach

如果 X 类以其他方式使用 Y 类,例如有一个类型为 Y 的成员,那么您需要对 Y 类进行完整定义,而前向声明是不行的。

【讨论】:

    【解决方案3】:

    如果你指的是同一个头文件的循环引用,一个常见的约定是将头文件包装在一个定义中,这样定义只包含一次,比如这个 MyHeader.h 文件:

    #ifndef MyHeader_h
    #define MyHeader_h
    
    // my definitions here
    
    #endif  // MyHeader_h
    

    #pragma once 指令也得到广泛支持。

    【讨论】:

      猜你喜欢
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多