這個問題在以前看別人代碼的時候看到過類之間的相互調用,但是一直想不通在文法上怎麼不會出錯。自己試著寫一個程式測試了一下。
這裡建立兩個類。一個是動物,一個是魚。
1.動物類中有一個成員函數prt(名字我隨便取得),函數負責輸出:我是動物。
2.然後魚類的一個成員函數p()調用動物的prt去輸出:我是動物。
3.動物類中再用t()去調用魚的p函數去輸出:我是動物。
在main函數中我們分別對動物和魚執行個體化一下,分別調用t和p;
不要被繞暈了。
我相信如果只要求完成1.2.兩步的話,大家應該都沒有什麼問題。關鍵是第三步。
1.增加一個函數prt;
2.去魚類的標頭檔中包含動物類的標頭檔。聲明一個動物類的變數。在魚類的成員函數中用動物類的執行個體去調用prt;
在第三步時開始的時候一樣會不假思索的到動物類的標頭檔中去包含魚類的標頭檔。
但是這一步你就走的太草率了。開始的時候你在魚類的標頭檔中已經包含了動物類的標頭檔,你現在又在動物類的標頭檔中去包含魚類標頭檔。這樣相互的標頭檔包含肯定是個錯誤。不信你看
標頭檔的相互包含是錯誤的,但並不是類相互的調用就是錯誤的。你可以想一想,這是為什麼。類之間的調用其實是執行個體化之後的調用。比如:動物我執行個體化一頭牛。魚我執行個體出兩條魚A,B.牛調用A的一個函數要A替牛喊我是動物。B調用牛去喊我是動物。看上去是類之間的相互調用,其實執行個體之間的相互調用。A,B在記憶體中是相互獨立的。
但是怎麼執行個體化兩條魚呢?在執行個體化牛的時候我們直接使調用動物類去聲明一個變數,利用建構函式去執行個體化了。但是在執行個體化魚的時候我們卻不能這麼直接。因為沒有魚類的標頭檔。那怎麼辦呢?
1.在動物的標頭檔中不能包含魚類的標頭檔,但是可以在動物的.cpp中去包含。想想這是為什嗎?
所以你可以這麼寫:在.cpp中去包含魚的標頭檔。然後執行個體化魚。調用魚的函數去喊:我是動物。完成相互調用
2.第一種方法執行個體化的魚是一個局部變數。如果我想要一個全域變數的魚怎麼辦呢?那隻能去標頭檔中聲明了。
你就必須在動物的標頭檔中這麼聲明:
class fish;
注意不要寫成:class fish{};或者寫出它的內部成員資料來。只要像上面這麼寫就對了。如果你寫出了內建函式。編譯會出錯,說已經重複定義了這個fish。然後定義一個全域變數。但是你是否可以這麼定義呢? : fish fi;
這樣依舊是錯誤的。因為這個fish暫時還不是真正的那個可以執行個體化的魚。它沒有建構函式。所以這裡我們用到了指標。你可以這麼寫:fish *fi。暫時不執行個體化,等到到.cpp中包含了魚的標頭檔的時候在去執行個體化。比如在動物的建構函式中我們這樣:
fi=new fish;這樣我們就完成了類之間的相互調用了。