問題
兩個類a、b相互呼叫,在兩個類a和b的標頭檔案中 #include 了所需的標頭檔案,編譯報錯。
為什麼呢,a需要b,b需要a,形成了迴圈,違反了程式的確定性原則。
原因在於:class bbb;這種方式僅僅是一種符號宣告,告訴編譯器存在bbb這個類,不會去確定bbb這個類的所佔資源(記憶體)大小和這個類的實現。
解決
在aaa.h中定義的是bbb的指標變數或引用變數,而不是普通的bbb變數,這是因為定義指標變數或引用變數,編譯器只需給該變數分配4位元組(32位程式)記憶體,而不用管bbb物件具體需要占用多少記憶體,也不去確定該類的建構函式是如何實現的,這些事情是在建立該物件(即aaa.cpp中:b = new bbb;)時才會去確定;
但是若定義普通的bbb變數:bbb b; 的話,編譯器需要知道b變數占用了多大記憶體,建構函式如何實現,然後計算需要為aaa類分配記憶體大小,這樣只是宣告class bbb;就不行了,否則會報錯:「使用了未定義的類bbb」,解決辦法是#include"bbb.h」,又回到了開始的問題。
同理,bbb.h中關於aaa的宣告及變數定義也是如此。
優點
使用前置變數,即:在標頭檔案中宣告該類,在實現檔案中包含該類。有其一定的優勢,以aaa類為例:
C 類宣告 類前置宣告
參考自 關於前置型別宣告的注意點 一 class b class a class b 上述 能夠通過編譯。二 class b class a class b 上述 報錯。error list c2079 a adata uses undefined class b c2027 use of unde...
C 模板類的前置宣告
template class linkedstack template class node template class linkedstack linkedstack bool isempty const bool isfull const t top const linkedstack add...
C 裡類的前置宣告分析
首先,讓我們來了解下c 裡函式的情況,然後再模擬到類的情況 我們在用c 寫 時 假設原始檔只有乙個main.cpp 經常會按照以下步驟寫 先對自定義的函式進行宣告 在main函式裡呼叫第1步裡宣告好的函式 編寫函式的實際 這一步也叫函式的定義 簡單例子如下,include using namespa...