回调函数概念与示例
来源:互联网 发布:软件售后服务收费标准 编辑:程序博客网 时间:2024/05/20 13:06
回调函数机制:
(1)定义一个回调函数
(2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
(3)当特定事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理
简单来说,回调函数就是调用者通过函数指针调用的函数,也就是说把函数指针作为参数传递给另一个函数,并用来调用它指向的函数时,这个以此函数指针为参数的函数就称为回调函数。
举个例子
#include <iostream>#include <cstring>using namespace std;typedef void (*FP)(char* s); //以char*为参数的函数指针类型为FP//三种不同函数void f1(char* s){ cout << "f1方法: " << s << endl; }void f2(char* s){ cout << "f2方法: " << s << endl; }void f3(char* s){ cout << "f3方法: " << s << endl; }class CallBack{public:char* s;CallBack(){ s = nullptr; }CallBack(char* tmp){int len = strlen(tmp) + 1;s = new char[len];strcpy_s(s, len, tmp);}void CallF(FP fp) //回调函数,调用FP类型的指针{fp(s);}~CallBack(){if (s != nullptr)delete s;}};int _tmain(int argc, _TCHAR* argv[]){CallBack obj("hello");//模拟事件obj.CallF(f1);obj.CallF(f2);obj.CallF(f3);return 0;}
可以看出,回调函数不关心谁是调用者,只关心被调用函数是什么。
现在回顾回调函数的概念主要是由于看到win32程序里窗口函数都被设计成了Callback函数,因为很多时候操作系统也要调用你的窗口函数,所以窗口函数设计为callback形式开放一个接口给操作系统调用。
用上面一段代码CallF能调用一堆FP类型的函数,有时候需要根据调用者类型来安排被调用函数。
而在win32程序里消息映射里则是类似这样的一个机制
struct MSGMAP_ENTRY{UINT nMessage;LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);};//消息与处理例程的对照表格struct MSGMAP_ENTRY _messageEntries[] = {WM_CREATE, OnCreate,WM_PAINT, OnPaint,WM_SIZE, OnSize,WM_COMMAND, OnCommand.WM_CLOSE, OnClose,WM_DESTROY, OnDestroy};#define dim(x) (sizeof(x) / sizeof(x[0]))//于是窗口函数可以这么设计LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){for (int i = 0; i < dim(_messageEntris); i++){if (message == _messageEntries[i].nMessage){return ((*_messageEntries[i].pfn)(hWnd, message, wParam, lParam));}}}
当系统接收到相应消息时,可以通过nMessage来判断fpn,也就是要调用的函数,并执行它,这就是回调函数了。
就像最初那段代码我可以定义为char* s为某类型字符串时时调用f1函数,另一类型字符串时调用f2函数,等等。
其实也就是设计模式中的策略模式
0 0
- 回调函数概念与示例
- 回调函数 Callback function 的概念与程序示例
- 钩子函数与回调函数概念
- 回调函数概念与应用
- 回调函数的概念与使用
- 回调函数概念
- 回调函数概念
- 回调函数示例
- 回调函数示例
- 回调函数示例
- 回调函数概念摘抄
- 回调函数概念理解
- JavaScript回调函数的概念与范例
- 回调函数示例(一)
- C++回调函数示例
- Android 回调函数示例
- Java回调函数示例
- 回调函数的概念及其使用
- 华硕新Chromebook C200/C300上市 亚马逊可预定售249美元
- Android[高级教程] Android程序调用摄像头
- 《学习,只有勤奋是不够的》指学生一
- 变量的存储类型
- python 的数据类型分层展示
- 回调函数概念与示例
- JQuery/HTML5学习笔记
- 用NDK编译Live555 - 亲测有效
- poj1042
- VNC远程连接Linux桌面的安装和使用
- C语言实现mencpy函数
- css中的position、z-index、clearfix
- C中使用extern修饰函数
- 【散文】 一个人的旅行