c++ 不破坏类封装的回调函数构思
来源:互联网 发布:刺客信条3低配优化 编辑:程序博客网 时间:2024/04/29 08:19
众所周知,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++ 封装
- CEGUI对回调函数的封装
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
- C 回调函数
- 【c++】回调函数
- C 回调函数
- C回调函数
- [C] 回调函数
- C 回调函数
- C回调函数
- [C++]回调函数
- ajax对象的封装对回调函数的理解
- C语言编程之你不知道的事——回调函数
- C++中回调函数的封装——实现。
- C++中回调函数的封装——使用
- 对触摸精灵的封装(按钮)及其回调函数
- c下面的回调函数
- C语言基础知识之(三):循环、随机数
- 6-06. 任务调度的合理性(25) -- 拓扑排序
- Matlab
- c语言中 快速输出字符数组后几位方法
- Java之旅hibernate(2)——目录结构
- c++ 不破坏类封装的回调函数构思
- 协议和代理
- 九度 1105 - 字符串处理 - 字符串的反码
- 获取当前触摸点坐标
- 输出字符指针的值
- 母版页的使用总结
- ASP.NET MVC 4 插件化架构简单实现-思路篇
- struts 2 标签 总结
- 20多个常用的免费WebService接口