2012-09-24 72 views
0

我有3个类:A,B和C. C是由B编辑的#include,B是由A编辑的#includ。在C类中,我定义了一个按钮的处理程序,当按钮被推入,C将PostMessage给对象A.如果我在C中包含A,我将有一个循环引用,那么我应该怎么做才能避免这个循环引用?C++包括避免循环引用

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

+1

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

回答

7

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

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

在实现文件中,你会包括A.h不过没关系。另外,如果可以,请尽可能使用A.hB.h中的正向声明。

+0

嗯,我的类/对象结构看起来像这样:'A'实际上是一个带有'tab control'的窗口,它的每个tab都是一个'B'对象(这是另一个'tabcontrol'),每个'B '每个标签都有'C' obj。 'C'类有几个按钮,当我按下时,发送一条消息到'A'(每个按钮发送不同的消息)。而所有这些,都是另一个窗口的一部分,主窗口。 “C”对象没有指向“A”的指针,“A”通过“B”具有指向“C”的间接指针。 – MRM

+0

@MRM你明白什么是前瞻性声明并尝试使用它吗? –

+0

不错。这正是我需要的。谢谢! – MRM

1

如果类X只有指针使用类Y,你应该声明类X.

这是一个好主意,让您的前置声明在一个单独的文件之前使用Y类的正向声明。 iosfwd is a standard example of this approach

如果类X以其他方式使用类Y,例如具有类型Y的成员,那么您需要类Y的完整定义,并且前向声明不会执行。

0

如果你指的是同一头文件的循环引用,一个共同的约定是包报头在DEFINE所以定义只包括一次,这样MyHeader.h文件:

#ifndef MyHeader_h 
#define MyHeader_h 

// my definitions here 

#endif // MyHeader_h 

也被广泛支持的是#pragma once指令。