C 類的前置宣告用法

2021-10-21 05:55:34 字數 677 閱讀 8991

問題

兩個類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...