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或者全局函數,實現間接調用。