C++ 实现把非静态成员函数作为回调函数(非static)
来源:互联网 发布:知乎排名 编辑:程序博客网 时间:2024/05/11 14:05
众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
在一次偶然的机会下,看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量,然后通过该变量来调用成员函数。把逻辑整理了一下,然后写了一个简单的回调代理类,通过这个类,可以简单的实现非静态函数的回调。
CallbackProxy.h
- #ifndef __CALLBACK_PROXY_H__
- #define __CALLBACK_PROXY_H__
- //Tobject:调用对象的类型,Tparam回调函数参数的类型
- 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; //调用对象
- };
- //设置调用对象及其回调函数
- 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
下面演示下如何使用该类
test.cpp
- #include "CallbackProxy.h"
- class CTest
- {
- public:
- CTest(int 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;
- }
- CTest::CTest(int nNum):
- m_nSum(nNum)
- {
- }
众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
在一次偶然的机会下,看到了一种方法可以简单的实现回调非静态成员函数,其原理就是把要调用该成员函数的对象实例赋值给一个变量,然后通过该变量来调用成员函数。把逻辑整理了一下,然后写了一个简单的回调代理类,通过这个类,可以简单的实现非静态函数的回调。
CallbackProxy.h
- #ifndef __CALLBACK_PROXY_H__
- #define __CALLBACK_PROXY_H__
- //Tobject:调用对象的类型,Tparam回调函数参数的类型
- 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; //调用对象
- };
- //设置调用对象及其回调函数
- 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
下面演示下如何使用该类test.cpp- #include "CallbackProxy.h"
- class CTest
- {
- public:
- CTest(int 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;
- }
- CTest::CTest(int nNum):
- m_nSum(nNum)
- {
- }
- C++ 实现把非静态成员函数作为回调函数(非static)
- C++ 实现把非静态成员函数作为回调函数(非static)
- C++ 实现把非静态成员函数作为回调函数(非static)
- C++ 实现把非静态成员函数作为回调函数(非static)(转)
- C++ 实现把非静态成员函数作为回调函数(非static)(转 待研究)
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数中调用类中的非静态成员变量或非静态成员函数
- 回调函数的C++ 封装(非静态成员函数的回调函数实现方法)
- 回调函数(类静态函数)中调用类中的非静态成员变量或非静态成员函数
- 回调函数中如何调用类中的非静态成员变量或非静态成员函数
- Java AWT Adapter 练习代码
- 【Java常用工具类】之log4j 二: log4j.properties配置格式
- QT 中添加资源图片
- POJ 2593 Max Sequence
- 移动硬盘安装Win PE详细图解教程
- C++ 实现把非静态成员函数作为回调函数(非static)
- POJ 1013
- 现实迷途 第三十四章 响亮一巴(上)
- 公路收费系统(控制台c++)
- hdu Big Number
- static静态变量的理解
- C语言数组首地址和数组名取地址区别
- MFC的程序执行顺序
- JSP内置对象----config