博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回调函数调用类成员函数的方法
阅读量:4110 次
发布时间:2019-05-25

本文共 834 字,大约阅读时间需要 2 分钟。

        利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时,就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。

        要解决这一问题的关键就是不让this指针起作用,有以下两种方法:

            1、不使用成员函数,直接使用普通C函数,而为了实现在C函数中可以访问类的成员变量,可以使用 friend 操作符,在C++中将该C函数说明为类的友元即可。

            2、使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。

        静态成员函数具有两大特点:

            其一,可以在没有类实例的情况下使用;

            其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。

        由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如m_pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。

转载地址:http://gttsi.baihongyu.com/

你可能感兴趣的文章
storm集群配置以及java编写拓扑例子
查看>>
html中的响应式图片
查看>>
深入理解JavaScript内部原理(6): 闭包
查看>>
Https发送接口的方法
查看>>
设计模式的分类
查看>>
数组里的随机数问题
查看>>
vue 组件库
查看>>
省选专练JSOI2007合金
查看>>
和Leo一起做爱数学的好孩子之CERC2017 Gambling Guide
查看>>
POJ 1328
查看>>
第三次作业
查看>>
LightOj 1215 Finding LCM
查看>>
Cheatsheet: 2012 05.04 ~ 05.15
查看>>
怎样充分借助互联网自学
查看>>
洛谷 [P2764]最小路径覆盖问题
查看>>
Siteserver平台搭建
查看>>
将博客搬至CSDN
查看>>
8.装饰模式(Decorator Pattern)
查看>>
OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)
查看>>
谈谈我对正则表达式的认识
查看>>