回调函数:
百度百科:回调函数
知乎:回调函数是什么,第一名的答案很形象,我就是按照这个思路去理解自己第一个项目里的回调函数,你可以按照这个思路看以下代码
wiki:维基百科好
我对回调函数的理解就是:底层触发事件,通过预先留在那的线找到对这个事件进行响应的上层函数。
我是因为要第一个项目要写一个很基础的SDK要用到回调,开始是不理解的,为什么要这样做,直接当时触发当时响应就行了?头跟我说:作为一个SDK,你只需要告诉上层有这个事情发生,你没有权利处理这个事件,是需要使用你这个SDK的人才有权利决定该怎么做,你只需要暴露接口给他就行了,而怎么做是他的事,也应当是他的事。
我茅塞顿开是因为我想到这个情形:一个小官,当管理的地区发生他职责以外的事件,他应该向上头反应这个事情,因为他处理会越权并且吃力不讨好,而上头知道这件事后的处理方式,他只要乖乖听就行了。这样才是当官之道。
你看程序中处处有哲理~
相信每个实习的童鞋都会碰到要写回调函数的时候,比如项目中或者带你的头要求,今天有空刚好,所以写一个简单的回调函数供大家参考。(我找的回调函数的例子都不太好,本来想找一个别人写的好一点的讲解一下,后来不得不自己花十分钟写了一个)。
先想好自己要干什么,步骤清楚才开始动手。所以,首先我想实现一个通过键盘键入(你可以看出是底层触发的条件),来实现前后左右的移动,就和玩RPG游戏一样,键盘输入一个键达到触发条件并告诉上层,上层根据这个事件来进行自己的反馈。所以代码自然也就出来了(工程打包上传了,需要的童鞋自己在文章末尾下载):
首先给出callBack.h
#define KeyBoard 1
class Event{
public:
int eventType;
int key;
};
typedef void(*Handle)(Event event);//指定回调函数的类型要为void HandleFunc(Event event)
在这里我们定义了Event类,并且对回调函数进行了定义。
再给出callBackFunc.h
#include "callBack.h"
#include "iostream"
using namespace std;
Handle func;
void SetEventCallBack(Handle handle)
{
func = handle;
}
void keyCallBack(){
char key;
cin >> key; // 输入字符
Event event;
event.eventType = KeyBoard;
/* 键盘的触发传值进入event中*/
switch (key)
{
case 'w':
event.key = 1;
case 'W':
event.key = 1;
break;
case 'a' :
event.key = 2;
case 'A':
event.key = 2;
break;
case 's' :
event.key = 3;
case 'S':
event.key = 3;
break;
case 'd':
event.key = 4;
case 'D':
event.key = 4;
break;
default:
event.key = 0;
break;
}
func(event); // 将event暴露给上层
}
void pollEvent()
{
while (1)
{
keyCallBack(); // 让底层触发事件RUN起来
}
}
这里的目的就是把键盘的相应转换成event格式暴露给上层
再给出上层函数~
TestCallBack.cpp
// TestCallBack.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "callBackFunc.h"
void eventHandler(Event e);
int _tmain(int argc, _TCHAR* argv[])
{
SetEventCallBack(eventHandler);
pollEvent();
return 0;
}
/* 回调函数,也就是事件响应时,你要用它来对底层暴露出来的event进行响应 */
void eventHandler(Event e)
{
if (e.eventType == KeyBoard)
{
switch (e.key)
{
case 1:
cout << "向前一步" << endl;
break;
case 2:
cout << "向左一步" << endl;
break;
case 3:
cout << "向后一步" << endl;
break;
case 4:
cout << "向右一步" << endl;
break;
default:
cout << "原地打转" << endl;
break;
}
}
}
好了,我们让程序跑起来:
大功告成!
另外插一句,就是回调函数里面case 1.. 你可以调用其它类或者底层库,不一定是简单的cout,如果真的可以让一个角色动起来当然最好了~
程序:回调函数
这里给大家一个小彩蛋,我发现这么一个小工程在visual studio下都占了十M左右的磁盘空间,所以搜索了一下,大家可以按照给出的网址进行配置,可以使磁盘容量看起来舒服很多:移除ipch目录和sdf文件