C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.
- template < class Class, typename ReturnType, typename Parameter >
- class SingularCallBack
- {
- public:
- typedef ReturnType (Class::*Method)(Parameter);
- SingularCallBack(Class* _class_instance, Method _method)
- {
- //取得对象实例地址,及调用方法地址
- class_instance = _class_instance;
- method = _method;
- };
- ReturnType operator()(Parameter parameter)
- {
- // 调用对象方法
- return (class_instance->*method)(parameter);
- };
- ReturnType execute(Parameter parameter)
- {
- // 调用对象方法
- return operator()(parameter);
- };
- private:
- Class* class_instance;
- Method method;
- };
示例:
以下是两个类实现.
- class A
- {
- public:
- void output()
- {
- std::cout << "I am class A :D" << std::endl;
- };
- };
- class B
- {
- public:
- bool methodB(A a)
- {
- a.output();
- return true;
- }
- };
SingularCallBack的各种调用示例:
- A a;
- B b;
- SingularCallBack< B,bool,A >* cb;
- cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
- if((*cb)(a))
- {
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- {
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- }
- A a;
- B b;
- SingularCallBack< B,bool,A >* cb;
- cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);
- if(cb->execute(a))
- {
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- {
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- }
- A a;
- B b;
- SingularCallBack< B,bool,A >cb(&b,&B::methodB);
- if(cb(a))
- {
- std::cout << "CallBack Fired Successfully!" << std::endl;
- }
- else
- {
- std::cout << "CallBack Fired Unsuccessfully!" << std::endl;
- }
- class AClass
- {
- public:
- AClass(unsigned int _id): id(_id){};
- ~AClass(){};
- bool AMethod(std::string str)
- {
- std::cout << "AClass[" << id << "]: " << str << std::endl;
- return true;
- };
- private:
- unsigned int id;
- };
- typedef SingularCallBack < AClass, bool, std::string > ACallBack;
- int main()
- {
- std::vector < ACallBack > callback_list;
- AClass a1(1);
- AClass a2(2);
- AClass a3(3);
- callback_list.push_back(ACallBack(&a1, &AClass::AMethod));
- callback_list.push_back(ACallBack(&a2, &AClass::AMethod));
- callback_list.push_back(ACallBack(&a3, &AClass::AMethod));
- for (unsigned int i = 0; i < callback_list.size(); i++)
- {
- callback_list[i]("abc");
- }
- for (unsigned int i = 0; i < callback_list.size(); i++)
- {
- callback_list[i].execute("abc");
- }
- return true;
- }
引用:
可以看一下我的<如何使用类的成员方法指针?>: http://blog.csdn.net/kyee/archive/2009/03/20/4009735.aspx
C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)的更多相关文章
- C++中回调函数(CallBack)的使用
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...
- node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了
最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...
- 【Android 应用开发】Android中的回调Callback
回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...
- Android jni中回调java的方法
在上一篇的基础上,添加在C++代码中回调java方法. 代码如下: Demo.java 中添加callback函数, 打印一条log. package com.example.scarecrow.dy ...
- 安卓程序代写 网上程序代写[原]Android中的回调Callback
回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 1. 如何定义一个回调 a. 定义接口 : 在 ...
- Android中的回调Callback
回调就是外部设置一个方法给一个对象, 这个对象可以执行外部设置的方法, 通常这个方法是定义在接口中的抽象方法, 外部设置的时候直接设置这个接口对象即可. 例如给安卓添加按钮点击事件, 我们创建了OnC ...
- 关于Array的map方法中回调函数参数的问题
开门见山,我们先来看两个例子. var arr=['1','4','9','16']; var r=arr.map(Math.sqrt); 猜猜r的结果会是多少? 没错就是 [1,2,3,4] 我们再 ...
- [转] Java内部类之闭包(closure)与回调(callback)
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它 不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥 ...
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...
随机推荐
- 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)
作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- 1.10 Python基础知识 - 序列:列表
在Python中有很多的组合数据类型,其中包括列表,元组,字符串等数据类型,这些数据类型统称为序列类型,用他们可以处理复杂的数据. 列表,是一组有序元素组合的数据结构.列表是可变的数据类型. 列表采用 ...
- 【前端图表】echarts实现散点图x轴时间轴
话不多说,老规矩,先上图,实现echarts实现散点图,x轴数据为时间年月日. 实现代码如下: <!DOCTYPE html> <html> <head> < ...
- C#执行sql文件
C# 执行sql文件 2012-05-11 12:28:57| 分类: App Develop|举报|字号 订阅 /// <summary> /// 执行sq ...
- 【CodeForces】Gargari and Bishops
依据贪心能够知道,放置的教主必须不能相互攻击到(也就是不在一条对角线上)才干够使得结果最大化. 依据观察能够得到教主相互不攻击的条件是他的坐标和互为奇偶(x + y) 之后直接暴力,处理每一个坐标对角 ...
- Dcloud课程7 单例模式一般用在什么场景
Dcloud课程7 单例模式一般用在什么场景 一.总结 一句话总结:连接数据库,这样就保证了和数据之间只有一个连接,从而能够不占用多余资源,这样就极大的减少了资源浪费,减少了mysql或者说服务器压力 ...
- 关于js盒子模型的知识梳理
盒子模型 JS盒子模型中的13个常用属性: clientWidth/clientHeight:可视区域的宽高,宽高+PADDING组成 clientTop/clientLeft:上边框和左边框的宽度 ...
- PythonOOP面向对象编程2
编程语言的特征: 继承 封装 多态 如:C++ / Java / Python / Swift / C# inheritance 继承 drived 派生 概念: 继承是指从已有的类中衍生出新类,新类 ...
- softmax 与 sigmoid & softmax名字的由来
Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广. 参考:http://blog.csdn.net/u014422406/article/details/52805924 ...
- VMware Ubuntu安装具体过程
不是每个程序猿都必须玩过linux,仅仅是博主认为如今的非常多server都是linux系统的,而自己属于那种前端也搞.后台也搞,对框架搭建也感兴趣,可是非常多生产上的框架和工具都是安装在server ...