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

时间:2012-09-24 15:21:05

标签: c++ include cyclic-reference

我有3个类:A,B和C. C由#include编辑,B由A编辑#includ。在C类中,我为按钮定义了一个处理程序,并且当按下按钮时,C将PostMessage对象A.如果我在C中包含A,我将有一个循环引用,那么我该怎么做才能避免这种循环引用呢?

编辑:所有包含都是在实施文件中制作的。

3 个答案:

答案 0 :(得分:7)

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

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

在实施文件中,您将包含A.h,但这没关系。另外,如果可以,请尽可能使用A.hB.h中的转发声明。

答案 1 :(得分:1)

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

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

如果类X以其他方式使用类Y,例如具有类型Y的成员,则需要类Y的完整定义,并且前向声明不会这样做。

答案 2 :(得分:0)

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

#ifndef MyHeader_h
#define MyHeader_h

// my definitions here

#endif  // MyHeader_h

#pragma once指令也广泛支持。