C++回调:利用函数指针
1 #include <iostream> 2 using namespace std; 3 4 5 /************************************************************************/ 6 /* 下层实现: CALLBACK */ 7 /************************************************************************/ 8 9 typedef void (*CALLBACKFUN)(int a,int b); 10 11 class base 12 { 13 private: 14 int m; 15 int n; 16 static CALLBACKFUN pfunc; 17 public: 18 base():m(0), n(0){}; 19 void registercallback(CALLBACKFUN fun,int k,int j); 20 void callcallback(); 21 }; 22 23 CALLBACKFUN base::pfunc=NULL; /* static初始化 */ 24 25 // 注册回调函数 26 void base::registercallback(CALLBACKFUN fun,int k,int j) 27 { 28 pfunc=fun; 29 m=k; 30 n=j; 31 } 32 33 void base::callcallback() 34 { 35 base::pfunc(m,n); 36 }
下层定义回调函数的时候,需要提供以下几个接口:
1. 实现注册接口:提供一个接口给上层,通过该接口,上层注册回调实现接口,下层将该实现接口地址传递给定义的回调指针(CALLBACKFUN),该初始化动作是必须的,否则无法实现回调;
2. 触发接口:该接口提供触发行为,当调用该接口时,就会触发一次函数回调;
1 // cbByfunction.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "cbByfunction.h" 6 7 /************************************************************************/ 8 /* 上层回调注册 */ 9 /************************************************************************/ 10 void seiya(int a,int b) 11 { 12 cout << "..." << a << "..." << b << endl; 13 cout << "this is seiya callback function" <<endl; 14 } 15 16 void zilong(int a,int b) 17 { 18 cout<<a<<endl<<b<<endl; 19 cout<<"this is zilong callback function"<<endl; 20 } 21 22 int main(int argc, char* argv[]) 23 { 24 // 注册下层回调函数 25 base c_base; 26 c_base.registercallback(seiya, 5, 6); 27 c_base.callcallback(); 28 c_base.registercallback(zilong, 7, 8); 29 c_base.callcallback(); 30 return 0; 31 }