回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.

  1. template < class Class, typename ReturnType, typename Parameter >
  2. class SingularCallBack
  3. {
  4. public:
  5. typedef ReturnType (Class::*Method)(Parameter);
  6. SingularCallBack(Class* _class_instance, Method _method)
  7. {
  8. //取得对象实例地址,及调用方法地址
  9. class_instance = _class_instance;
  10. method        = _method;
  11. };
  12. ReturnType operator()(Parameter parameter)
  13. {
  14. // 调用对象方法
  15. return (class_instance->*method)(parameter);
  16. };
  17. ReturnType execute(Parameter parameter)
  18. {
  19. // 调用对象方法
  20. return operator()(parameter);
  21. };
  22. private:
  23. Class*  class_instance;
  24. Method  method;
  25. };

示例:

以下是两个类实现.

  1. class A
  2. {
  3. public:
  4. void output()
  5. {
  6. std::cout << "I am class A :D" << std::endl;
  7. };
  8. };
  9. class B
  10. {
  11. public:
  12. bool methodB(A a)
  13. {
  14. a.output();
  15. return true;
  16. }
  17. };

SingularCallBack的各种调用示例:

  1. A a;
  2. B b;
  3. SingularCallBack< B,bool,A >* cb;
  4. cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
  5. if((*cb)(a))
  6. {
  7. std::cout << "CallBack Fired Successfully!" << std::endl;
  8. }
  9. else
  10. {
  11. std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
  12. }
  1. A a;
  2. B b;
  3. SingularCallBack< B,bool,A >* cb;
  4. cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
  5. if(cb->execute(a))
  6. {
  7. std::cout << "CallBack Fired Successfully!" << std::endl;
  8. }
  9. else
  10. {
  11. std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
  12. }
  1. A a;
  2. B b;
  3. SingularCallBack< B,bool,A >cb(&b,&B::methodB);
  4. if(cb(a))
  5. {
  6. std::cout << "CallBack Fired Successfully!" << std::endl;
  7. }
  8. else
  9. {
  10. std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
  11. }
  1. class AClass
  2. {
  3. public:
  4. AClass(unsigned int _id): id(_id){};
  5. ~AClass(){};
  6. bool AMethod(std::string str)
  7. {
  8. std::cout << "AClass[" << id << "]: " << str << std::endl;
  9. return true;
  10. };
  11. private:
  12. unsigned int id;
  13. };
  14. typedef SingularCallBack < AClass, bool, std::string > ACallBack;
  15. int main()
  16. {
  17. std::vector < ACallBack > callback_list;
  18. AClass a1(1);
  19. AClass a2(2);
  20. AClass a3(3);
  21. callback_list.push_back(ACallBack(&a1, &AClass::AMethod));
  22. callback_list.push_back(ACallBack(&a2, &AClass::AMethod));
  23. callback_list.push_back(ACallBack(&a3, &AClass::AMethod));
  24. for (unsigned int i = 0; i < callback_list.size(); i++)
  25. {
  26. callback_list[i]("abc");
  27. }
  28. for (unsigned int i = 0; i < callback_list.size(); i++)
  29. {
  30. callback_list[i].execute("abc");
  31. }
  32. return true;
  33. }

引用:

C++ Callback Solution

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/force_eagle/article/details/4347329
 
如:在事件处理线程类中调用未知的类对象的方法,线程对象只负责运行处理方法时就非常有用了。你可以下载KYLib: http://download.csdn.net/source/1538376,在KYLib类库中用到非常多的事件方法指针,可以参考学习。
 
其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确。
可以看一下我的&lt;如何使用类的成员方法指针?&gt;: http://blog.csdn.net/kyee/archive/2009/03/20/4009735.aspx
 
 

C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)的更多相关文章

  1. C++中回调函数(CallBack)的使用

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

  2. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  3. 【Android 应用开发】Android中的回调Callback

    回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...

  4. Android jni中回调java的方法

    在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...

  5. 安卓程序代写 网上程序代写[原]Android中的回调Callback

    回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 1. 如何定义一个回调 a. 定义接口 : 在 ...

  6. Android中的回调Callback

    回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...

  7. 关于Array的map方法中回调函数参数的问题

    开门见山,我们先来看两个例子. var arr=['1','4','9','16']; var r=arr.map(Math.sqrt); 猜猜r的结果会是多少? 没错就是 [1,2,3,4] 我们再 ...

  8. [转] Java内部类之闭包(closure)与回调(callback)

    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...

  9. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

随机推荐

  1. go reflect 调用方法

    package main import ( "fmt" "reflect" ) type A struct { } func (A) Test() { fmt. ...

  2. 找不到或无法载入主类 org.jivesoftware.openfire.starter.ServerStarter

    刚接触openfire的配置就出现了这个错误.解决方法非常easy,忘记了将openfire的源文件加入到user entries中了

  3. tomcat的一些简单配置

    一.管理tomcatusernamepassword conf文件夹下,tomcat-users.xml <span style="font-size:24px;">& ...

  4. menu-普通menu弹出框样式

    今天接触到了menu弹出框样式.主要就是在theme下进行调整.现在把接触到的知识点总结一下. 在theme中,跟menu有关的几个属性如下 <item name="panelBack ...

  5. UML学习之用例图

    在UML的整个学习过程中,9种图(用例图.活动图.状态图.顺序图.类图.对象图.协作图.组件图.部署图)的学习以及常用开发.建模工具的使用是最为重要的一个阶段,它是进行UML建模的基础.在本篇文章中首 ...

  6. Win8.1部署 .NET Framework 3.5 安装方式

    Windows 8.1中包含.NET Framework,操作系统安装过程中默认安装 .NET Framework 4.5.1.如果程序需要.NET Framework 3.5支持,将自动启用相关功能 ...

  7. 开发板 Linux驱动视频 驱动是什么

    内存管理单元很重要. linux把设备看成文件,(open,read,write,ioctrl,close)主要写这几个函数. 哈弗结构,取指令和取数据同时进行. arm处理器体系架构以及发展方向 单 ...

  8. vue使用jsonp

    axios不支持jsonp,所以需使用其他插件:vue-jsonp npm i vue-jsonp -S 然后在 src/main.js : import Vue from 'vue' import ...

  9. 网络博客 VC\图案像处理

    http://blog.csdn.net/lvwx369/article/category/1185452 http://blog.csdn.net/lyy289065406/article/deta ...

  10. 使用Tomcat发布war包

    第一步:下载tomacat 1.下载地址:http://tomcat.apache.org 2.解压后目录如下 3.双击bin文件夹下startup.bat 即可启动tomcat, 计算机会弹出控制台 ...