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或者全局函数,实现间接调用。