如果不想犯下面錯誤最好的做法是,先把每一個類都定義好后,再寫函數實現部分(本例中將void A::funcA(B* inB)就放到了最后實現),寫在前面的類,需要使用后面的類的時候只需要聲明一下(像本例中的class B;放在A類前一樣),但使用的時候只能是以指針的形式出現!
注:其實把訪問放到實現文件(CPP)中會自然避免這個問題,寫到頭文件中便不能訪問成員且實現的代碼也比較多,也不好實現成Inline函數。
#ifndef TESTCLASS_H #define TESTCLASS_H #include <iostream> using namespace std; class B; //這樣的聲名方聲只能在指針參數和指針變量 e.g.funcA(B* inB),B* m_pB; //不能用與對象的定義 e.g. B m_b 會報使用未定義的 class“B”; //也不能調用B類中的方法會報funcB”的左邊必須指向類/結構/聯合/泛型類型 //因為沒有先定義!class B僅僅是聲明不是定義! class A { public: void funcA(B* inB); }; //錯誤的位置,出現在類B前 //void A::funcA(B* inB) //{ // inB->funcB();//使用了未定義類型“B”||“->funcB”的左邊必須指向類/結構/聯合/泛型類型 // //一定要先定義聲明再使用 //} class B { public: void funcB(){cout <<"this is fucB"<<endl;} }; //正確的位置,要出現在類B后面 void A::funcA(B* inB) { inB->funcB(); } #endif client.cpp #include "TestClass.h" void main() { A a; B b; a.funcA(&b); }