C 中的「X 未命名型別」錯誤
C 中,遇到「X 未編譯型別」錯誤時,表示表示器無法辨識指定的類型。這種情況經常發生在類別依賴關係中,其中一個類別引用了另一個尚未定義的類別。
考慮以下程式碼:
class User { public: MyMessageBox dataMsgBox; }; class MyMessageBox { public: void sendMessage(Message *msg, User *recvr); Message receiveMessage(); vector<Message> *dataMessageList; };
編譯此程式碼時,編譯器會遇到「MyMessageBox 未命名類型」錯誤。這是因為,當編譯器處理 User 類別時,它還沒有遇到 MyMessageBox 的定義。
要解決這個問題,必須顛倒類別定義的順序。然而,這會產生循環依賴,因為 MyMessageBox 的定義現在需要 User 的定義。
要打破循環,可以使用前向聲明。前向聲明允許在定義類別之前對其進行聲明。這允許編譯器識別類別的存在,而不需要其完整定義。
class User; // Forward declaration of User class MyMessageBox { public: void sendMessage(Message *msg, User *recvr); Message receiveMessage(); vector<Message> *dataMessageList; }; class User { public: MyMessageBox dataMsgBox; };
在此修改後的程式碼中,類別 User 被前向聲明,允許 MyMessageBox 的定義引用它。定義了 MyMessageBox 後,就可以完全定義 User 類別了。
此外,考慮更改 MyMessageBox 中的 sendMessage 函數,以對 Message 和 User 參數採用引用而不是指標。這可確保呼叫函數時兩個參數均有效且可用。
void sendMessage(const Message& msg, User& recvr);
以上是為什麼我在 C 中收到“X 未命名類型”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!