遞歸阻礙類別定義
最近的程式查詢解決了在類別中聲明反映類別自身類型的私有成員的問題。具體來說,以下程式碼會引發「不完整類型」錯誤:
class A { private: A member; }
但是,使用指標而不是直接成員聲明(「A* member;」)可以解決這個問題。為什麼會這樣呢?
答案就在類別定義過程中。當在類別定義中聲明成員時,類別本身仍然被定義。這使得“A”類型未定義,使其成為“不完整類型”。相反,當使用指標時,編譯器甚至在定義完成之前就可以將“A”識別為類別名,從而允許它定義“指向 A 的指標”類型。
這個概念超出了類別的範圍。將類型聲明為“Foo;”有效地表示類別聲明,但沒有其完整定義。然而,「Foo* foo;」可以被定義,因為它代表一個指向「Foo」類型的指針,編譯器在該階段確認該類型。
當使用引用自身的遞歸型別定義時,同樣的原理也適用。然而,僅使用指標來實現這一點提供了更直接的方法。考慮以下替代方案:
class A { private: boost::shared_ptr<A> member; };
透過使用智慧指標(例如 boost::shared_ptr),消除了手動記憶體管理的需要。
以上是為什麼使用類別指標可以避免遞歸類定義中的「不完整型別」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!