CALLBACK回调函数

回调函数一定是个全局函数

若该函数是一个独立的函数,那该函数自然具有全局属性;若该函数是一个类的成员函数,那该函数前面需要加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类型的成员变量以保存传入的函数指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值