代码之家  ›  专栏  ›  技术社区  ›  MRM

避免由C++includes头引起的循环引用[重复]

  •  0
  • MRM  · 技术社区  · 12 年前

    我有三个班:A、B和C。C是 #include 由B表示,而B是 #includ 在类C中,我为按钮定义了一个处理程序,当按下按钮时,C将 PostMessage 到对象A。如果我在C中包含A,我将有一个循环引用,那么我应该怎么做才能避免这个循环引用呢?

    编辑:所有内容都包含在实施文件中。

    3 回复  |  直到 6 年前
        1
  •  7
  •   Luchian Grigore sgryzko    12 年前

    您应该使用正向声明。自从 C 不是的所有者 A ,我假设您有一个指针作为成员。因此,您不需要包括:

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

    在实现文件中,您将包括 A.h 但没关系。此外,如果可以的话,在 A.小时 B.h 在可能的情况下。

        2
  •  1
  •   emesx    12 年前

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

    将转发声明保存在一个单独的文件中是个好主意。 iosfwd is a standard example of this approach

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

        3
  •  0
  •   mark    12 年前

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

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

    同样得到广泛支持的还有 #pragma once 指令。