C 嵌套類型/類別的前向聲明
在C 中,巢狀類型和類別是組織代碼和封裝資料的有用功能。然而,前向聲明嵌套類型提出了獨特的挑戰。
考慮下列情境:
class A { public: typedef struct/class { ... } B; ... C::D *someField; }; class C { public: typedef struct/class { ... } D; ... A::B *someField; };
通常,您可以使用下列語法前向聲明類別名稱:
class A;
但是,這種方法對於巢狀類型失敗。以下語句會導致編譯錯誤:
class C::D;
為什麼不能轉發巢狀類型
無法轉送聲明巢狀類型是限制C語言語法。它與編譯器解析和解析類別聲明和引用的方式有關。
當遇到前向宣告時,編譯器會在記憶體中為類別物件保留一個佔位符。然而,對於巢狀類型,編譯器不知道在哪裡放置這個佔位符,因為外部類別的定義尚未解析。
解決方法
不幸的是,有沒有直接解決這個問題的方法。要解決此問題,您必須至少取消嵌套一個嵌套類別。例如,您可以將程式碼重組為以下形式:
typedef struct/class Outer { ... Nested *someField; }; class Nested { ... }; class A { public: typedef Outer B; ... }; class C { public: typedef Outer D; ... };
透過將 Outer 設為單獨的類型,您現在可以轉發聲明 A::B 和 C::D。這使得編譯成功並提供所需的功能。
以上是為什麼我不能在 C 中轉發聲明巢狀類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!