C++回调函数的处理

原创 2004年07月03日 22:26:00

 

  由于DDEML机制需要使用回调函数,因此使用DDEML的关键是解决在MFC编程体系中回调函数的使用。回调函数(Callback function)大量用于Windows的系统服务,通过它,程序员可以安装设备驱动程序和消息过滤系统,以控制Windows的有效使用。许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。

  1). 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种处理机制与普通的C编程中使用回调函数一样。

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

C++ 使用回调函数的方式 和 作用。 持续更新

先看两个demo: 一.在类test1中调用函数print() ,把print()的函数指针传递给test1的函数指针参数 test1.h: #include #include using nam...
  • qq_17242957
  • qq_17242957
  • 2016年11月01日 23:57
  • 1936

ROS回调函数的类方法实现,both in Python 和 C++

用类的方式实现ROS的回调函数的方法,包括Python和C++版本。
  • u013832707
  • u013832707
  • 2017年09月08日 09:03
  • 712

使用类的成员函数作为API定时器的回调函数

有时候,我们在使用API定时器时,需要使用类的成员函数作为其回调函数,但是,编译器为了保护成员函数,编译是不能通过的。那么我们怎么才能使用类的成员函数作为API定时器的回调函数呢?我们可以嵌入一段汇编...
  • zjccsg
  • zjccsg
  • 2016年07月16日 19:57
  • 891

C++中回调函数的一个简单例子?

回调函数应用实例: 1、定义一个Person类 (Person.h)文件: 注意:在这个类中指定了回调函数,回调函数的执行者,和回调函数指针 重要的是  回调函数和回调函数指针是怎么关联的? ...
  • yjhdxflqm
  • yjhdxflqm
  • 2016年01月08日 14:13
  • 1896

C++ 回调函数理解

编程中肯定会遇到在C++中使用回调函数的情况。 但是为什么要使用回调函数呢?我们需要理解回调函数设计原理 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种...
  • clirus
  • clirus
  • 2015年12月18日 13:49
  • 4296

C/C++ 回调函数详解

介绍c语言函数指针的概念及使用、回调函数的概念及使用、C++类成员函数作为回调函数的详细说明。...
  • aoshilang2249
  • aoshilang2249
  • 2014年08月13日 21:50
  • 1839

回调函数的C++ 封装

在进行软件开发的过程中,常会用到一些声明为CALLBACK 的函数,这些函数就是回调函数。使用回调函数可以改善软件的结构、提高软件的复用性。比如,在一个规模较大的软件项目中,可以将一些资源或相对独立的...
  • jia_xiaoxin
  • jia_xiaoxin
  • 2008年09月05日 18:35
  • 3181

C++回调函数的一点理解

回调函数是通过函数指针调用的函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就称为回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时...
  • u012043391
  • u012043391
  • 2017年04月08日 16:19
  • 464

不同类之间实现C++回调函数

回调函数 概念:回调函数,顾名思义,就是使用者自己定义一个函数,使用者自己实现这个函数的程序内容,然后把这个函数作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你...
  • Stone_OverLooking
  • Stone_OverLooking
  • 2017年08月30日 16:33
  • 523

我的C++回调函数的理解

今天在看一个多线程下载文件的代码时,让我很头痛。因为该程序中运用了大量的回调函数。 在我们学习一种技术的时候我们就要去知道几个问题 1.        回调函数是什么东西? 2.  ...
  • wangtiewei
  • wangtiewei
  • 2016年07月19日 23:25
  • 2256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++回调函数的处理
举报原因:
原因补充:

(最多只允许输入30个字)