要注意C ++ 的类的成员函数和一般的C 函数的区别。C + + 类采用this 规则传递函数。在使用类的成员函数作为回调函数,要求该成员函数被声名为静态成员函数,并且注意函数声名的时候要同时声明好参数传递规则。
简单的示例:
CallBackClass.h
#ifndef CALL_BACK_CLASS_H
#define CALL_BACK_CLASS_H
class CallBack{
public:
CallBack(){}
~CallBack(){}
typedef void(*call_back_func)(int);//先声明函数指针,即我们要调用的函数
public:
/*安装函数指针*/
void call_back( void(*call_back_func)(int),int n ){
call_back_func(n);
}
};
#endif
这里声明及定义写在了一起是为了方便。
main.cpp
#include <iostream>
#include "CallBackClass.h"
using namespace std;
void func(int n){ //该函数需为全局,或类中的静态函数
cout<<n<<endl;
}
int main()
{
CallBack a;
a.call_back_func(func,10);
}
我们调用对象a的成员函数call_back_func,该函数参数为一个函数指针及一个整型。传入函数名即将该函数地址传入,使其调用了func函数。
CallBackTest.h
#ifndef CALL_BACK_TEST_H
#define CALL_BACK_TEST_H
class CallBackTest{
public:
CallBackTest(){};
~CallBackTest(){};
typedef void(*call_back_func)(void*,int);
public:
/*绑定对象*/
void call_back(void* pThisObject,void(*call_back_func)(void*,int),int n){
my_Object = pThisObject;
my_func = call_back_func;
my_n = n;
}
void exec_back_func(){
my_func(my_Object,my_n);//这里将绑定到我们的静态函数
}
private:
call_back_func my_func;
int my_n;
void* my_Object;
};
#endif
main.cpp
#include <iostream>
#include "CallBackTest.h"
using namespace std;
class Proxy{
public:
static void need_call_func(void* pCurObject,int n){
Proxy* pObject = (Proxy*)pCurObject;
pObject->execFunc(n);
}
void Exec(){
CallBackTest callback;
callback.call_back(this,need_call_func,10);
callback.enec_back_func();
}
void execFunc(int n){
cout<<n<<endl;
}
};
int main()
{
Proxy test;
test.Exec();
return 0;
}
我们都知道,类的静态函数由该类的实例共享。
而这里的疑惑点在于,静态函数的安装。
1、callback.call_back(this,need_call_func,10);确认某个对象的参数
2、callback.exec_back_func();将我们的参数安装到静态函数
3、执行静态函数内容。
其实描述得不是很好,请各位试着自己理解。
对该程序还不是很清楚的 可通过调试才了解程序的执行。
原文地址:http://blog.csdn.net/bbinchina/article/details/45098183