前向宣告指在a程式中引入新的型別b,但是b並不是乙個完整清晰的類,因為我們只知道只是乙個b類,但是我們不清楚它的具體函式介面實現以及成員變數;不能定義乙個b的型別,只能使用指標和引用的方式;直到後面找到b的定義我們才真正直到b的具體實現,才可以呼叫它的實現方式;如果想直接定義這個類的話,則需要使用#include來包含這個類的標頭檔案。
類的前向宣告大多寫在.**件中,#include直接新增標頭檔案的方式看起來方便,提供了全部的介面,但是這樣的代價就是增加了編譯器的編譯工作量,大量匯入的標頭檔案會引起編譯比較慢;並且在兩方迴圈呼叫的情況下,比如a和b相互呼叫對方,在a呼叫b類相關的時候,b類可能還沒有定義好,那麼我們只能進行前向引用,只表明這是b類就好了。有倆種場景經常使用類的前向宣告,場景1為只有倆個.h包含抽象類,沒有其對應的.cpp,使用時直接前向宣告即可。場景2為有其對應的.cpp,則在.**件中進行前向宣告,.cpp中進行#include包含,然後具體實現在.cpp中。
限制情況:
1、只可使用這個類的指標以及引用型別,可以定義指標、引用(指標、引用的大小確定,可以生成),但不能夠定義該類的物件(不知道物件的大小,確認不了空間)
2、可以用於宣告,形參型別或返回型別為該型別的函式,可以是引用、指標、物件等
使用1:
//a類標頭檔案
class iauroratreasureclient
;//b類標頭檔案
class iauroratreasureclient;
class iclienthalllogicnew
;
使用2:
//a類的標頭檔案
class b;
class a;
//a類的cpp檔案
#include "a.h"
#include "b.h"
//直接在**中使用b類的物件以及成員函式、成員變數;
宣告成員函式的形參或者返回型別時,也可以用前向宣告,因為成員函式不佔類物件的大小,編譯器可以確定物件大小,前向宣告的作用在於告訴編譯器這個乙個在別的地方定義的型別。這樣編譯器就能生成正確的符號表了
注意事項:
//a類的標頭檔案
class b;
class a
};b* pb;}
//a類的cpp檔案
#include "a.h"
#include "b.h"
//直接在**中使用b類的物件以及成員函式、成員變數
在上面的呼叫中就會出現問題了,析構函式delete b的物件,但是此時這個物件只是個空殼,我們並不知道具體b的定義,因此會呼叫失敗,出現警告:deletion of pointer to incomplete type 'b_obj'; no destructor called(刪除指向不完整型別的指標,沒有呼叫析構函式) 類前向宣告
class a a void del a ptr int main 正常執行,delete p 先執行類析構函式,通知系統這塊記憶體上的資料已經無效無需維護了,然後使用operator delete 釋放這塊記憶體 class a void del a ptr class a a int main ...
類的前向宣告
在我們看一些c 標頭檔案的時候,經常可以看到某些類的宣告但卻找不到定義。如 class abc 僅僅宣告,沒有定義 通常後面還會有定義指向這個型別的指標或引用,如 abc pointer abc pointer 這種形式稱之為類的前向宣告 引用。在宣告之後,定義之前,類abc是乙個不完全型別 inc...
類的前向宣告
class person void show1 person k cout上述 在友元函式的類外實現中使用了該類,則需在之前宣告,上述 已做宣告。但是上述 依然會報錯,因為類的提前宣告,編譯器只是知道了person這是乙個類,該類的具體細節 例如成員變數 編譯器並不知道,所以此時person又叫做不...