c++回调机制全解:定义原型,注册,回调,封装.
来源:互联网 发布:tensorflow 英文教程 编辑:程序博客网 时间:2024/06/01 07:26
模块A调用模块B,但在B中,需要反过来调用到A的函数a(),则a()称为回调函数,在B中需要做的事:
1.约定回调函数原型.
2.定义注册回调函数
在A中需要:
1.定义回调函数
2.调用B的注册回调函数
使用回调函数的几个步骤:
1.在B中,约定借口规范,定义回调函数a()的原型
这里回调函数原型的定义最好遵循typedef void (*SCT_XXX)(LPVOID lp, const CBParamStruct& cbNode);
SCT_XXX -回调函数名称
lp -回调上下文
CBParamStruct -回调参数,一般由于要回调的参数不止一个,所以定义一个结构体比较方便。
2.在B中,定义注册回调函数
void RCF_XXX(SCT_XXX pfn, LPVOID lp);
RCF_XXX -注册函数名
pfn -回调函数名称(是指针)
lp -是回调上下文. 一般在A模块初始化完B模块后调用,将A模块中定义的回调函数地址赋值给pfn,lp赋值为this。
3.在A中,定义回调函数
回调函数声明成静态的,static void CF_XXX(LPVOID lp, const CBParamStruct& cbNode); 函数的参数必须与B模块中回调函数原型的参数保持一致。
在A中初始化B模块时,调用B的注册函数将模块A中声明的回调函数CF_XXX的地址传给pfn,即pfn=CF_XXX;(函数名称CF_XXX其实是个指针,指向回调函数的地址) 。然后lp一般为this.但若作为类,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
通常情况下,要实现成员函数作为回调函数,常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
利用回调代理类,可以简单的实现非静态函数的回调。
代码:
#ifndef CCALLBACKPROXY_H
#define CCALLBACKPROXY_H
template<typename Tobject, typename Tparam>
class CCallbackProxy
{
//约定回调函数原型
typedef void (Tobject::*CbFun)(Tparam*);
public:
//此处相当于注册函数
void Set(Tobject *pInstance, CbFun pFun);
bool Exec(Tparam* pParam);
private:
CbFun pCbFun; //回调函数指针
Tobject* m_pInstance; //调用对象
};
#if 1
//设置调用对象及其回调函数
template<typename Tobject, typename Tparam>
void CCallbackProxy<Tobject, Tparam>::Set(Tobject *pInstance , CbFun pFun)
{
m_pInstance = pInstance;
pCbFun = pFun;
}
//调用回调函数
template<typename Tobject, typename Tparam>
bool CCallbackProxy<Tobject, Tparam>::Exec(Tparam* pParam)
{
(m_pInstance->*pCbFun)(pParam);
return true;
}
#endif
#endif // CCALLBACKPROXY_H
///non cpp file
///main.cpp
#include <QCoreApplication>#include "ccallbackproxy.h"class CTest{public:
CTest(int nNum){
m_nSum = nNum;}
void CbPrintSum(int *pnAddNum){
printf("The Sum is %d\n", m_nSum+*pnAddNum);}
private:
int m_nSum;};int main(int argc, char* argv[]){CCallbackProxy<CTest, int> CbProxy;CTest TestInstance(20);//注册
CbProxy.Set(&TestInstance, &CTest::CbPrintSum);int nNum = 1000;CbProxy.Exec(&nNum);
return 0;}
阅读全文
0 0
- c++回调机制全解:定义原型,注册,回调,封装.
- 注册回调机制
- C语言中定义原型
- C语言中定义原型
- C语言指针定义全解
- 事件的触发机制,定义,注册
- C 函数声明, 函数原型, 函数定义
- 【C++】注册与回调
- jsp注册页面,全解
- C变量定义内存分配机制
- C变量定义和内存分配机制
- C和C++定义机制不同1
- UnityC#注册C++Dll事件回调
- C语言注册回调实例
- 注册机制
- 注册机制
- iterator_trait的原型定义
- 类String定义原型
- 命令行操作jar,文件写入中文乱码处理
- Robot Race UVALive
- SDK及API介绍
- stl-stack/queue/list
- SRM帮你轻松询报价,全面降低采购成本!
- c++回调机制全解:定义原型,注册,回调,封装.
- [linux]ubuntu下进行texlive+texstudio+xeCJK中文环境安装
- mysql 日期时间有关的函数
- Spring AOP和事务处理的自我总结
- 浅谈分布式消息技术 Kafka
- RobotFramework环境搭建
- Linux grep 文本搜索工具
- 初学者添加jar包或pom文件资源
- 腾讯2018应届毕业生秋招之市场/职能类招聘详情