函數指針調用類的成員函數

    1 在每個被調用函數之前加上static, 可以使成員函數脫離對象信息單獨存在,雖然它屬於這個類,但是沒有附帶上對象信息,但是前提是,static成員函數不能使用對象的信息(成員和函數)。

    2 使用一個全局函數做中轉,間接調用成員函數,如下代碼修改Test3:

#include <stdio.h>
#include <iostream>
class Test3;
void _cdecl Helper(Test3 *test3);

class Test3
{
public:

void Memberfun1(void (*f2)(Test3 *))
 {
  f2(this);
 }
 void  Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';
 }
 void Memberfun3()
 {
  //Memberfun1(Memberfun2);//出錯
  Memberfun1(Helper);
 }
};
void _cdecl Helper(Test3 *test3)
{
 test3->Memberfun2();
}

int main()
{
 Test3 t3;
 t3.Memberfun2();
 return 0;
}

3 使用一個函數參數函數對象信息的static類型的成員函數中轉,間接調用其它成員函數。

#include <stdio.h>
#include <iostream>
class Test3
{
public:
 static void _cdecl Helper(Test3 *test3)
 {
  test3->Memberfun2();
 }

 void Memberfun1(void (*f2)(Test3 *))
 {
  f2(this);
 }
 void  Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';
 }
 void Memberfun3()
 {
  Memberfun1(Helper);
 }
};

int main()
{
 Test3 t3;
 t3.Memberfun2();
 return 0;
}

    由此可見,函數指針不能直接調用類的成員函數,因爲成員函數指針和一般函數指針有着本質差別,因爲成員函數帶有很多對象信息。要解決調用的問題,應該使用static或者全局函數,實現間接調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章