回调函数

回调函数:
百度百科:回调函数
知乎:回调函数是什么,第一名的答案很形象,我就是按照这个思路去理解自己第一个项目里的回调函数,你可以按照这个思路看以下代码
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文件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值