2012-09-24 75 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指令。