从今天起,天天都要写博客,一天一博客;
第一篇博客:《回调函数》
C++的回调函数,其实就是函数指针的应用!
要想弄清楚回调函数,必须先弄清楚函数指针。
发现nachos实验中就经常用到函数指针,以前听袁军讲,一片迷茫,搞懂之后一片开阔!
很多初学者都搞不懂,回调函数跟普通函数有什么区别,有什么用,下面借助源码来搞定它!
表 24.7. 回调函数示例:void func(void (*f)(void *), void *p);
调用者 | 实现者 |
---|---|
|
|
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
#include <iostream>
using namespace std;
typedef void (*CALLBACK)( int a, int b );
class CBase
{
public:
CBase();
public:
/*
** 注册回调函数
**
*/
void RegisterCallback( CALLBACK fun, int k, int j );
/*
** 调用回调函数
**
*/
void CallCallback();
private:
/*
** 成员变量:
** 分别保存回调函数指针
** 回调函数中的形参参数
**
*/
int m;
int n;
CALLBACK func;
};
CBase::CBase()
{
func = NULL;
}
void CBase::RegisterCallback( CALLBACK fun, int k, int j )
{
func = fun;
m = k;
n = j;
return;
}
void CBase::CallCallback()
{
func( m, n );
return;
}
//
// 函数1
void fun1( int a, int b )
{
cout << "fun1 is called" << endl;
cout << a << " " << b << endl;
cout << "*****************" << endl;
return;
}
//
class CCall
{
public:
/*
** 函数2,类中的函数
** 注意这是个静态函数
*/
static void fun2( int a, int b );
};
void CCall::fun2( int a, int b )
{
cout << "fun2 is called" << endl;
cout << a << " " << b << endl;
cout << "*****************" << endl;
return;
}
//
void main(void)
{
CBase bbbbb;
bbbbb.RegisterCallback( fun1, 1, 2 );
bbbbb.CallCallback();
bbbbb.RegisterCallback( CCall::fun2, 10, 20 );
bbbbb.CallCallback();
}
OK!