首页 > 编程 > C++ > 正文

C++ 回调函数

2019-11-08 18:43:34
字体:
来源:转载
供稿:网友

回调函数是静态函数

#include <iostream> using namespace std;class App{public: typedef void(* pClassFun )(void*); static void m_CreateCb(void* user_data) { App *pThis = static_cast<App*>(user_data); PRintf("pThis = %p/n", pThis); } void demo(pClassFun func, void * user_data) { func(user_data); } void printfFuncAddress() { printf("Function m_CreateCb address = %p/n", m_CreateCb); } void begin() { demo(&m_CreateCb, this); }};int main(){ App a; a.printfFuncAddress(); a.begin(); return 0;}

回调函数是非静态函数

#include <iostream>using namespace std;class App{public: typedef void(App::*pClassFun)(void*); static void m_CreateCb(void* user_data) { cout << "m_CreateCb" << endl; } void CreateCb(void * user_data) { cout << "CreateCb" << endl; } void demo(pClassFun func, void * user_data) { (this->*func)(user_data); } void printfFuncAddress() { //error C2276: '&' : illegal Operation on bound member function expression //printf("Function CreateCb address = %p/n", &CreateCb); printf("Function CreateCb address = %p/n", &App::CreateCb); } void begin() { //demo(m_CreateCb, this); demo(&App::CreateCb, this); }};int main(){ App a; a.printfFuncAddress(); a.begin(); return 0;}

静态函数作为回调函数,这种用法很常用。理解C++中非静态成员方法有点困难,

首先要理解:

->* 指向成员操作的指针 ptr->*ptr_to_member

.* 指向成员操作的指针 obj.*ptr_to_member

->* .* 这两货是操作符

对比两种指针:

#include <iostream>using namespace std;class App{public: typedef void(App::*pClassFun)(void*); typedef void(*pCommonFun)(void*); static void m_CreateCb(void* user_data) { cout << " static m_CreateCb" << endl; } void CreateCb(void * user_data) { cout << "CreateCb" << endl; } void bind(pClassFun classFunc, void * user_data) { m_ClassFunc = classFunc; ClassFuncData = user_data; } void RegisterCallback(pCommonFun commonFunc, void * user_data) { m_CommonFunc = commonFunc; CommonFuncData = user_data; } void Demo() { RegisterCallback(m_CreateCb, this); bind(&App::CreateCb, this); //do something and then trigger callback (this->*m_ClassFunc)(ClassFuncData); m_CommonFunc(CommonFuncData); } void printfFuncAddress() { //error C2276: '&' : illegal operation on bound member function expression //printf("Function CreateCb address = %p/n", &CreateCb); printf("ClassFunc CreateCb address = %p/n", &App::CreateCb); printf("Common static CreateCb address = %p/n", &App::m_CreateCb); }private: pClassFun m_ClassFunc; void *ClassFuncData; pCommonFun m_CommonFunc; void *CommonFuncData;};int main(){ App app; app.printfFuncAddress(); app.Demo(); return 0;}

最后我们来看看非静态函数作为回调函数的应用

sigslot的实现

#include <vector>#include <iostream>using namespace std;template<typename T, typename T1>class slot{public: slot(T* pObj, void (T::*pMemberFunc)(T1)) { m_pObj = pObj; m_pMemberFunc = pMemberFunc; } void Execute(T1 para) { (m_pObj->*m_pMemberFunc)(para); }private: T* m_pObj; void (T::*m_pMemberFunc)(T1);};template<typename T, typename T1>class signal{public: void bind(T* pObj, void (T::*pMemberFunc)(T1 para)) { m_slots.push_back(new slot<T, T1>(pObj, pMemberFunc)); } ~signal() { vector<slot<T, T1>* >::iterator ite = m_slots.begin(); for (; ite != m_slots.end(); ite++) { delete *ite; } } void operator()(T1 para) { vector<slot<T, T1>* >::iterator ite = m_slots.begin(); for (; ite != m_slots.end(); ite++) { (*ite)->Execute(para); } }private: vector<slot<T, T1>* > m_slots;};class receiver{public: void callback1(int a) { cout << "receiver1: " << a << endl; } void callback2(int a) { cout << "receiver2: " << a << endl; }};class sender{public: sender() : m_value(0) {} int get_value() { return m_value; } void set_value(int new_value) { if (new_value != m_value) { m_value = new_value; m_sig(new_value); } } signal<receiver, int> m_sig;private: int m_value;};int main(int argc, char** arg){ receiver r; sender s; s.m_sig.bind(&r, &receiver::callback1); s.m_sig.bind(&r, &receiver::callback2); s.set_value(1); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选