c++回調之利用函數指針示例
#include <iostream>
using namespace std;
/************************************************************************/
/* 下層實現: CALLBACK */
/************************************************************************/
typedef void (*CALLBACKFUN)(int a,int b);
class base
{
private:
int m;
int n;
static CALLBACKFUN pfunc;
public:
base():m(0), n(0){};
void registercallback(CALLBACKFUN fun,int k,int j);
void callcallback();
};
CALLBACKFUN base::pfunc=NULL; /* static初始化 */
// 注冊回調函數
void base::registercallback(CALLBACKFUN fun,int k,int j)
{
pfunc=fun;
m=k;
n=j;
}
void base::callcallback()
{
base::pfunc(m,n);
}
下層定義回調函數的時候,需要提供以下幾個接口:
1. 實現注冊接口:提供一個接口給上層,通過該接口,上層注冊回調實現接口,下層將該實現接口地址傳遞給定義的回調指針(CALLBACKFUN),該初始化動作是必須的,否則無法實現回調;
2. 觸發接口:該接口提供觸發行為,當調用該接口時,就會觸發一次函數回調;
// cbByfunction.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "cbByfunction.h"
/************************************************************************/
/* 上層回調注冊 */
/************************************************************************/
void seiya(int a,int b)
{
cout << "..." << a << "..." << b << endl;
cout << "this is seiya callback function" <<endl;
}
void zilong(int a,int b)
{
cout<<a<<endl<<b<<endl;
cout<<"this is zilong callback function"<<endl;
}
int main(int argc, char* argv[])
{
// 注冊下層回調函數
base c_base;
c_base.registercallback(seiya, 5, 6);
c_base.callcallback();
c_base.registercallback(zilong, 7, 8);
c_base.callcallback();
return 0;
}