2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C++ 实现把非静态成员函数作为回调函数(非static)

C++ 实现把非静态成员函数作为回调函数(非static)

时间:2023-10-16 07:21:54

相关推荐

C++ 实现把非静态成员函数作为回调函数(非static)

众所周知,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) { }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。