C++成员函数作为回调函数的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uagvdu/article/details/78850252

1. 编程分两类
一,应用编程和系统编程
系统编程就是编写底层的库, 应用编程就是利用已经编写好的库的接口来编写某种具有某些功能的程序,即应用
所谓的库,就是为了给应用提供接口,以方便程序员使用


2. 回调函数
当程序跑起来的时候, 一般情况 ,应用程序会通过直接调用库里准备好的接口
但是 : 有些库函数却需要应用先传递一个函数,好在合适的时候被调用,而这个传入的函数就是回调函数

3. 举例
打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数to register a callback function)。如下图所示(图片来源:维基百科):

4. C++中类成员函数作为回调函数的问题
回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。
普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。 由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。
这样从理论上讲,C++类的成员函数是不能当作回调函数的。但我们在用C++编程时总希望在类内实现其功能,即要保持封装性,如果把回调函数写作普通函数有诸多不便。经过网上搜索和自己研究,发现了几种巧妙的方法,可以使得类成员函数当作回调函数使用。

方法一:回调函数为普通函数,但在函数体内执行成员函数 : 即在成员函数内部,登记回调函数;
方法二:设置回调函数为static,然后以 类名::函数 的方式调用
方法三:回调函数声明在类外,全局的传类对象指针给回调函数即可使用类内成员,因为回调函数是全局的所以影响了类的封装性

猜你喜欢

转载自blog.csdn.net/uagvdu/article/details/78850252