// A.h class A { ... };
// B.h #include "A.h" class B { ... private: A a; ... };
上面這段程式碼中,由於 B 類別擁有 A 類別的成員變數,因此必須引入定義 A 類別的 A.h。然而,這樣做的缺點是,每當 A.h 內發生任何變動時,引入 B.h 的編譯單元也必須重新編譯。如果大型專案中存在著很多這樣的依賴關係的話,那麼專案的編譯時間就會變得很長。
因此,比較好的做法應該使用"前置宣告",我們試著將程式碼改成下面這樣
// B.h class A; // 前置宣告 class B { ... private: A a; // 編譯錯誤!!! ... };
上面這段程式碼無法通過編譯。主要的原因是,編譯器需要在編譯期就要計算出 B 類別的大小。然而,因為在 B.h 中並沒有 A 類別的定義,編譯器無從得知 A 類別到底多大,所以也就無法推算出 B 類別的大小。
要解決這個問題的辦法是: 使用指標或參考。我們將程式碼改成下面這樣
// B.h
class A; // 前置宣告 class B { ... private: A *a; // A 類別的指標 ... };
在這裡,我們將成員變數的型態從 A 類別轉換成 A 類別的指標。因為指標的大小是已知的,編譯器便可以在沒有 A 類別的定義下計算出 B 類別的大小了。如此一來,我們就可以不用引入 A.h,消除了 A.h 和 B.h 間的依賴關係。
沒有留言:
張貼留言