当前位置:  编程技术>c/c++/嵌入式

怎么实现类的成员函数作为回调函数

    来源: 互联网  发布时间:2014-10-21

    本文导语:  如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++...

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。  

1). 不使用成员函数,为了访问类的成员变量,可以使用友元操作符(friend),在C++中将该函数说明为类的友元即可。   

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

首先明白什么是回调函数:比如说被调函数void callbackf(int n){}要想作为回调函数的话,callbackf必须作为主调函数的形参出现,如void f(void (*p(int)),int n)形式才行!

例子:

例1:

代码如下:

#include
using namespace std;
class A
{
public:

 friend void callback()  //友元函数作为回调函数 friend方式实现
 {
  cout

    
 
 

您可能感兴趣的文章:

  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 谁帮我看一下下面几个实现函数需要实现要用到什么函数?在线等待,必给分!
  • java开源软件 iis7站长之家
  • 标准C下没有字符处理函数,怎样写一个实现下面功能的函数?
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • EJB QL都支持什么函数啊?能不能支持trim函数呢?如果不能,应该怎么实现这样的功能呢?
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • sendfile()函数为什么效率高? 它的实现难道没有涉及普通I/O函数么
  • Linux有定时器函数吗?是不是要自己实现?如果有的话是什么函数呢?谢谢
  • 自己实现strcpy函数的实现方法
  • C语言应用程序使用的函数来源于libc库, Libc库中的函数是在哪里实现的??
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • 如何实现Java下的回调函数!
  • 怎样从Linux源文件中找到函数实现方式?
  • 关于内核里实现的函数
  • 可不可以在程序中直接使用ftp客户端的函数实现文件传输?
  • 整型数据做函数的参数,怎样实现传地址,和调用程序共用一个地址?
  • 请问如何查看libX11.so中的函数实现
  • 菜鸟问题:linux各个函数的实现源代码在哪?
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 请问,pipe()这个管道建立函数在哪里实现的?
  • python实现异步回调机制代码分享
  • 跨平台python异步回调机制实现和使用方法
  • 使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • resin可以作为win2000的一个服务启动吗?如何实现
  • c++将引用或者是指针作为函数参数实现实参的运算
  • 探讨:用两个栈实现一个队列(我作为面试官的小结)
  • Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例的备份
  • 想实现一个程序 UDP例程的。 实现2个客户端通信, 而不是客户端于服务器的通信,大家帮忙想下怎么写啊。下面是我写的客户端和服务器的通信。 服务器作为中转数据
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • php实现socket实现客户端和服务端数据通信源代码
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 网站重定向用C语言实现iptables,ACL实现
  • boost unordered_map和std::list相结合的实现LRU算法
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • linux下如实现与window下的驱动器实现文件共享??
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • qt如何实现:操作键盘实现数据的滚动?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • html<pre>标签自动换行实现方法
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3