2010-06-06 55 views
0

假設我有一個A類和一個B類。自動需要的課程?

A的.h,需要B的.h,B的.h需要A.的.h(need = #include)。

所有.H有警衛:

#ifndef _classX_ 
#define _classX_ 
... 
... 
#endif 

但如果我編譯的的.cpp,那麼當它包括B的.H,B類別不能包含類因爲.H A級已使用警衛。

我該如何解決這個問題?

回答

5

您將需要其中一個類的前向聲明。

// a.h 
// do not #include b.h 

class B; // forward declaration 

class A { 
    .... 
    B * b; 
}; 

請注意,類A不能包含實際的B實例 - 它必須是指針或引用。你也不能通過頭中的B指針調用任何函數 - 它們將不得不進入包含兩個頭文件的.cpp源文件。

3

其中之一需要避免包含它。對於許多情況下,這是可能的,例如,你可以移動的#include到.cpp文件

class A { 
    // no need for header of B here 
    void f(B b); 

    // no need for header of B here either 
    B *b; 
}; 

一般爲函數的聲明,其定義是在.cpp文件,你不需要在任何的#includes頭。對於類成員,如果您希望將它們作爲嵌入的值對象,則只需要標題。在這種情況下,你需要將它們改爲指針(或智能指針),並將它們改變爲.cpp文件中的指針或new。對於編譯器知道什麼B在我上面的例子中,你只需要的A這樣的定義之前把預先聲明:

class B; 
+0

此外,您包括警衛應該不會有前導下劃線。這些保留供編譯器實施者和/或系統使用使用。 – George 2010-06-06 21:05:19