避免由C++引起的循环引用包括报头

避免由C++引起的循环引用包括报头,c++,include,cyclic-reference,C++,Include,Cyclic Reference,我有3个类:A、B和C。C由B包含,B由A包含。在C类中,我为按钮定义了一个处理程序,当按下按钮时,C将向对象A发送邮件。如果我在C中包含A,我将有一个循环引用,那么我应该如何避免这个循环引用 编辑:所有包含都在实现文件中进行。您应该使用正向声明。因为C不是A的所有者,所以我假设您有一个指针作为成员。因此,您不需要包括: class A; //forward declaration class C { A* a; }; 在实现文件中,您将包括A.h,但这没关系。此外,如果可以,请尽可能

我有3个类:A、B和C。C由B包含,B由A包含。在C类中,我为按钮定义了一个处理程序,当按下按钮时,C将向对象A发送邮件。如果我在C中包含A,我将有一个循环引用,那么我应该如何避免这个循环引用


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

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

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

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

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

最好将转发声明保存在单独的文件中


如果类X以另一种方式使用类Y,例如有一个类型为Y的成员,那么您需要对类Y进行完整的定义,而转发声明则不行。

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

#ifndef MyHeader_h
#define MyHeader_h

// my definitions here

#endif  // MyHeader_h

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

您还没有指定是将所有这些文件包含在implementation.cc、.cpp还是header.h中。看起来大多数回答者都认为你指的是头文件。我的类/对象结构是这样的:A实际上是一个带有选项卡控件的窗口,它的每个选项卡都是一个B对象,这是另一个选项卡控件,每个B的每个选项卡都有一个C对象。C类有几个按钮,当我按下时,会向a发送消息,每个按钮发送不同的消息。所有这些,都是另一个窗口的一部分,主窗口。C对象没有指向A的指针,而A有一个指向C到B的间接指针。@MRM您了解什么是转发声明并尝试使用它了吗?很好。这正是我需要的。非常感谢。