在介紹這個問題前,我們先簡要說一下類定義和聲明的區別。
類聲明:
class Screen; //Screen類的聲明
類定義:
class Screen{ //Screen類的定義
//etc...
};
當用實例化一個類的對象時,編譯器會根據類的定義來分配相應的存儲空間。也就是說,在創建對象前,一定要有完整的類定義,這樣編譯器才能正確的計算所需空間。
那麼我們來看如下代碼:
class Screen{
Screen sc; //error, 'sc' uses undefined class 'Screen'
//etc...
};
上述代碼中,由於Screen還沒有定義結束,在內部定義一個Screen類型的對象時,編譯器無法知道應該爲sc分配多少空間,因此會報註釋中的錯誤。
我們再看下面一段代碼:
class Screen{
Screen *sc1; //ok
Screen &sc2; //ok
};
在類定義時,已指向自身類型的指針或引用作爲數據成員則沒有問題。按照前面的介紹就很好理解了,由於指針和引用所佔存儲空間大小與類型無關,所以編譯器可以計算分配空間,所以正確。
還看到一個從對象構造過程的角度解釋這個問題的答案,貼在這裏:(原網頁鏈接爲參考資料的第二個)
因爲如果類包含自身類的對象,存在無限初始化的問題。
構造一個類的對象是,先構造成員變量,然後再調用自身的構造函數,如果類包含自身的的對象,那麼在調用構造函數之前,需要先構造自身類的對象。而構造自身類的對象時,又得先構造自身的對象,然後調用其構造函數……
參考資料:
爲什麼類的定義中不能包含其自身類型,但是能包含其自身的指針或引用類型
c++編程,爲什麼自身類的對象不可以作爲該類的成員,自身類的指針或引用卻可以?