首先明确一点即回调函数需要是静态函数,原因是普通的C++成员函数都隐含了一个this指针作为参数,这样使得回调函数的参数和成员函数参数个数不匹配。
若不想使用C式函数作为回调函数呢?主要有以下几种解决方法:
- 使用static修饰成员函数。static不含this指针。
- 不用static修饰的成员函数,需要借助中间变量来访问。
- 在回调函数中增加一个变量,类型为该类的类型,作为this指针的传递。
有时候成员函数并不能使用static进行修饰,此时可采用第二种方法,代码示例如下:
class A
{
public:
static void staticmember(){cout<<"static"<<endl;} //static member
void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member
virtual void virtualmember(){cout<<"virtual"<<endl;};//virtual member
};
int main()
{
A a;
//static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
void (*ptrstatic)() = &A::staticmember;
//nonstatic成员函数 取得的是该函数在内存中的实际地址
void (A::*ptrnonstatic)() = &A::nonstatic;
//虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
void (A::*ptrvirtual)() = &A::virtualmember;
//函数指针的使用方式
ptrstatic();
(a.*ptrnonstatic)();
(a.*ptrvirtual)();
}
直接用类名引出非静态成员函数,赋值给函数指针:
//nonstatic成员函数 取得的是该函数在内存中的实际地址
void (A::*ptrnonstatic)() = &A::nonstatic;
随后需要运行回调函数的时候,使用一个辅助变量来运行,格式为:(变量名. * 函数指针)(参数)
。
(a.*ptrnonstatic)();