1. 程式人生 > >解決C/C++ 標頭檔案相互包含 問題的方法

解決C/C++ 標頭檔案相互包含 問題的方法

http://blog.sina.com.cn/s/blog_6ef9a3ad0101emuw.html

http://blog.csdn.net/hazir/article/details/38600419

所謂超前引用是指一個型別在定義之前就被用來定義變數和宣告函式。

類A和類B需要彼此互相引用,這樣必然有一個類會先被定義,而另外一個類後被定義,這樣在
先被定義的類引用後被定義的類的時候,就導致了所謂的超前引用。

超前引用導致的錯誤有以下幾種處理辦法:
 
1)使用類宣告
  在超前引用一個類之前,首先用一個特殊的語句說明該識別符號是一個類名,即將被超前引用。其使用方法是:
          a)  用class ClassB;宣告即將超前引用的類名
          b)  定義class ClassA
          c)  定義class ClassB;
          d)  編制兩個類的實現程式碼。
   上述方法適用於所有程式碼在同一個檔案中。一般情況下,ClassA和ClassB分別有自己的標頭檔案和cpp檔案,這種方法需要演變成:
          a) 分別定義ClassA和ClassB,並在cpp檔案中實現之
          b) 在兩個標頭檔案的開頭分別用class ClassB;和class ClassA;宣告對方
          c) 在兩個cpp檔案中分別包含另外一個類的標頭檔案
   NOTE:這種方法切記不可使用類名來定義變數和函式的變數引數,只可用來定義引用或者指標。  

2)使用全域性變數
   由於全域性變數可以避免超前引用,不用贅述。我的習慣是,把類物件的extern語句加在該類標頭檔案的最後,大家喜歡怎樣寫那都沒有什麼大問題,關鍵是保證不要在標頭檔案中胡亂包含。

3)使用基類指標。
   這種方法是在引用超前引用類的地方一律用基類指標。而一般情況下,兩個互相引用的類並不涉及其基類,因此不會造成超前引用。以開始的例子說:在CMyDialog類中用CView*代替CMyView*,在CMyView類中用CDialog*代替CMyDialog*,這樣必然不會造成超前引用。

   說明:本文中,為了敘述方便,把class AClass;語句成為類AClass的宣告,把classAClass開始的對AClass的類成員變數、成員函式原型等的說明稱為類的定義,而把在CPP中的部分稱為類的定義。如果大家對這三個詞有不同的理解,請按照自己的本意
把這三個詞換成相應的詞來理解。