假設我有一個A類和一個B類。自動需要的課程?
A的.h,需要B的.h,B的.h需要A.的.h(need = #include)。
所有.H有警衛:
#ifndef _classX_
#define _classX_
...
...
#endif
但如果我編譯的的.cpp,那麼當它包括B的.H,B類別不能包含類因爲.H A級已使用警衛。
我該如何解決這個問題?
假設我有一個A類和一個B類。自動需要的課程?
A的.h,需要B的.h,B的.h需要A.的.h(need = #include)。
所有.H有警衛:
#ifndef _classX_
#define _classX_
...
...
#endif
但如果我編譯的的.cpp,那麼當它包括B的.H,B類別不能包含類因爲.H A級已使用警衛。
我該如何解決這個問題?
您將需要其中一個類的前向聲明。
// a.h
// do not #include b.h
class B; // forward declaration
class A {
....
B * b;
};
請注意,類A不能包含實際的B實例 - 它必須是指針或引用。你也不能通過頭中的B指針調用任何函數 - 它們將不得不進入包含兩個頭文件的.cpp源文件。
其中之一需要避免包含它。對於許多情況下,這是可能的,例如,你可以移動的#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;
此外,您包括警衛應該不會有前導下劃線。這些保留供編譯器實施者和/或系統使用使用。 – George 2010-06-06 21:05:19