前幾天很不爽,因為C++中兩個類中互相包含對方對象的指標編譯時間提示某一個類未定義。。。所以我就想啊想,這樣也對,我的標頭檔都有#ifndef的,包含了一次就不能再包含了,以為就實現不了這樣的功能,於是就改了設計方案:
class A{public: A(B* pB):m_pB(pB) { }private: B* m_pB;};class B{public: B() {}private: int m_i;};
只在一個類中包含另一個類的指標(算是聚類吧,A不管理m_pB的死活),而在B需要A的屬性時通過傳遞參數進去。這樣有些麻煩,但是勉強達到了我的需求。
今天,又遇到一個必須使用相互包含對象指標的問題,要不然通過參數傳來傳去麻煩的不得了。所以還是百度了下,結果終於找到了:(c++)兩個類相互包含引用的問題。裡面說的和我需要的差不多,解決方案是一樣的。
文章裡面說的很清楚了,我也在這裡複述一遍吧,主要解決的就是檔案包含的問題:在A的標頭檔(A.h)中包含B的標頭檔(B.h),在A的源檔案(A.cpp)中包含(A.h),在B的標頭檔中使用A的聲明(class A;)而不是包含A的標頭檔,然後在B的源檔案(B.cpp)中包含A的標頭檔和B的標頭檔。代碼如下:
// A.h#include "B.h"class A{public: A(B* pB):m_pB(pB) {} void useB();private: B* m_pB;};//A.cpp#include "A.h"void A::useB(){ //do something for m_pB}//B.hclass A;class B{public: B(A* pA):m_pA(pA) {} void useA(); private: A* m_pA;};//B.h#include "A.h"#include "B.h"void B::useA(){ //do something for m_pA}
這樣的話B的標頭檔中不能有使用A的對象指標m_pA的代碼,否則會出現“使用了未定義的A”錯誤。
最後,問題算是解決了,但是我現在還是有點不明白的,這C++標頭檔的包含和類的聲明等等都應該牽涉到編譯器的編譯順序問題,忘大師為我講解下這是為什麼。
謝謝觀眾的捧場!