當前位置:編程學習大全網 - 遊戲軟體 - C++兩個類之間的成員函數怎麽相互調用,怎麽老是報錯。

C++兩個類之間的成員函數怎麽相互調用,怎麽老是報錯。

1) 將需要調用的成員函數設為static 類型,如:在前述例子2中,將class Test2 成員函數Compare 定義前加上static 如下(黑體為改變之處):

class Test2{//….int static __cdecl Compare(const void* elem1, const void* elem2) //成員函數。//其他不變}

改變後的代碼編譯順利通過。原因是,static 類型的成員函數與類是分開的,其函數指針也不包含對象信息,與壹般函數指針壹致。這種方法雖然簡便,但有兩個缺點:1、被調用的函數成員定義內不能出現任何類的成員(包括變量和函數);2、由於使用了static 成員,類在被繼承時受到了限制。

(2) 使用壹個函數參數含有對象信息的static 類型的成員函數為中轉間接地調用其他成員函數,以例3為例,將類Test3作如下修改(黑體字為修改之處),main()函數不變,則可順利通過編譯:

class Test3{ public:  //…  void static __cdecl Helper(Test3* test3)  {   test3->Memberfun2();  }  void Memberfun1( void (* f2)(Test3*)) { f2(this) ;} //將對象信息傳給Helper函數。  void Memberfun2( ) {printf(%s \n,Calling Test3::Memberfun2 OK); } //成員函數2。  void Memberfun3( ) { Memberfun1( Helper);}  //…};

這種間接方式對成員函數沒有任何限制,克服了第壹種方法成員函數不能使用任何類的成員的缺點,但由於有static 成員,類的繼承仍受到制約。

(3)使用壹個全程函數(global function)為中轉間接調用類的成員函數,仍以例3為例,將代碼作如下修改(VC++6.0編譯通過):

class Test3;void __cdecl Helper(Test3* test3);class Test3{ public:  //…  void Memberfun1( void (* f2)(Test3*)) { f2(this) ;} //成員函數1調用成員函數//2。  void Memberfun2( ) {printf(%s \n,Calling Test3::Memberfun2 OK); } //成員函數2。  void Memberfun3( ) { Memberfun1( Helper);}  //…};void __cdecl Helper(Test3* test3){ test3->Memberfun2();};

這個方法對成員函數沒有任何要求,但是需要較多的代碼。

  • 上一篇:抖音怎麽上傳照片圖集
  • 下一篇:暖暖的幸福金滿堂和秦嵐跳舞是哪壹集
  • copyright 2024編程學習大全網