前幾天很不爽,因為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.h class 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++頭文件的包含和類的聲明等等都應該牽涉到編譯器的編譯順序問題,忘大師為我講解下這是為什么。
謝謝觀眾的捧場!