回调函数一定是个全局函数。
若该函数是一个独立的函数,那该函数自然具有全局属性;若该函数是一个类的成员函数,那该函数前面需要加static关键字以去掉this指针。
一.类的某个成员函数Test()中需要用到一个功能函数Function(),而该功能函数Function()需要一个回调函数CallbackProc的指针作参数。
写法如下:
.h文件
class A
{
voidTest();//该函数内将调用CALLBACK函数
}
.cpp文件
定义CALLBACK函数:
VOID CALLBACK CallbackProc(WPARAMwParam,LPARAM lParam)
{
……
}
在类的函数内调用CALLBACK函数:
void A:: Test()
{
Function(CallbackProc,wParam,lParam);
}
但该写法有以下特点:
①调用回调函数CallbackProc的函数Function已经在外部定义好了,类内部仅仅是引用Function函数而已
②该回调函数CallbackProc仅仅在类内实现,并只供类内调用,不会交给用户实现
二.需要定义一个函数Function(),该函数要使用回调函数,而回调函数需要交给使用者实现。
1.非类成员函数形式
示例代码:
typedef int ( *CBFun)(intaValue); //声明一个名为CBFun的函数
typedef int CBFun(intaValue); //声明一个名为CBFun的函数
//上面两个声明是等效的,可以任选一个使用
int CBTest(CBFunpFun ,intinputValue) //定义测试函数CBTest,该函数内部需要用到回调函数CBFun。将自定义的CBFun以参数形式传入
{
int theResult = (*pFun)(inputValue);
return theResult;
}
void main()
{
intMyCBFunction(intmyValue); //声明自定义的CBFun
cout<<CBTest(MyCBFunction,5)<<endl; //调用测试函数CBTest
}
int MyCBFunction(intmyValue) //对自定义的CBFun进行实现
{
return (myValue+10);
}
最终输出结果是15。
对于上面的示例代码,CBTest函数以及回调函数CBFun声明都是定义好的,用户只需要对回调函数CBFun按照给定格式进行实现。已经定义好的CBFun声明规定了回调函数的格式。但仅仅是格式规定好了,所谓格式即返回值类型、参数个数以及参数类型,至于函数名以及参数名,这些都可以自定义。比如上面规定了回调函数:
typedef int ( *CBFun)(intaValue); //声明一个名为CBFun的函数
这行代码规定了回调函数的返回值是int型,其参数个数为1,参数类型为int。
所以对回调函数进行自定义时,可以这样写:
int MyCBFunction(intmyValue); //声明自定义的CBFun
完全满足上面的格式要求。
对于回调函数的调用函数:
int CBTest(CBFunpFun ,intinputValue);
第一个参数需要传入自定义的回调函数名。所以:
CBTest(MyCBFunction,5);
是可以的。
2.类成员函数形式
示例代码:
class CCallbackTest
{
public:
typedef int CBFun(intaValue); //声明一个名为CBFun的函数
intCBTest(CBFunpFun ,int inputValue) //定义测试函数CBTest,该函数内部需要用到回调函数CBFun。将自定义的CBFun以参数形式传入
{
inttheResult = (*pFun)(inputValue);
return theResult;
}
};
void main()
{
intMyCBFunction(intmyValue); //声明自定义的CBFun
CCallbackTest theTest;
cout<<theTest.CBTest(MyCBFunction,5)<<endl;
}
int MyCBFunction(intmyValue) //对自定义的CBFun进行实现
{
return (myValue+10);
}
最终输出结果是15。
由示例代码可见,类成员函数的情况跟非类成员函数的情况类似。类的成员函数CBTest需要传入一个回调函数CBFun。在类内对回调函数CBFun进行格式定义,不用进行CBFun的实现,然后传给CBTest即可。
用户使用类对象的CBTest函数时,要首先对回调函数CBFun按照给定格式进行实现。然后调用即可。
注意回调函数CBFun的声明一定要在函数CBTest之前。
回调函数CBFun进行格式定义后,CBFun就可以当做一个变量类型来用,类似int。所以,可以在类中定义CBFun类型的成员变量以保存传入的函数指针。