zoukankan      html  css  js  c++  java
  • 理解回调函数,回调函数的使用

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

    一、普通函数和回调函数

    普通的函数一般包括函数名和函数实现这两部分,并且这两部分是固定好的,也就是说我们调用这个函数实现的功能是明确的、是唯一的(只提供了一种功能)

    然后在使用的时候,调用该函数名+(...)就可以使用这个功能,括号很重要、很重要、很重要。。。。。。

    还有就是普通的函数不能作为参数一样被传递,只能通过函数名+(...)的形式被使用

    回调函数还是一个函数,它也是有函数名和函数实现这两个部分组成,区别在回调函数是可以被当作参数一样被传递(可移动的),

    当回调函数被当作参数传递时,相当于一个指向函数的一个指针(函数指针),回调函数的函数名就是一个函数指针,注意不能带括号

    在需要用到回调函数的功能的时候,就可以通过函数名+()的形式去使用

    这么一对比,好像回调函数除了能作为参数一样被传递,和普通函数也没啥区别,但是使用起来很灵活

    C++中的多态是通过虚函数和继承来实现的,但是在C语言中没有多态的概念,就是通过回调函数实现类似多态的功能

    1、主函数需要调用回调函数

    2、中间函数登记回调函数

    3、触发回调函数事件

    4、调用回调函数

    5、响应回调事件



    回调函数的简单案例
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include<stack>
    #include<math.h>
    #include<string>
    #include<string.h>
    using namespace std;
    
    //定义一个函数指针,这个函数指针的类型名叫callback,它指向的函数返回值为void,调用的参数为void
    typedef void(*callback)(void);
    //定义命令结构体
    typedef struct cmd {
        string name;  //命令的名字
        callback func;  //与命令相对应的函数指针
    
        cmd(string A, callback B) { name = A, func = B; }
    }cmd_t;
    
    
    //响应回调函数,实现回调函数的功能
    void hello()
    {
        printf("hello
    ");
    }
    void hi()
    {
        printf("hi
    ");
    }
    void exit() {
        exit(0);
    }
    
    //中间函数登记回调函数
    void cmd_hello() {
        hello();
    }
    
    void cmd_hi() {
        hi();
    }
    
    void cmd_exit() {
        exit();
    }
    
    //回调函数登记表
    const cmd_t cmd_table[] = {
        {"hello",cmd_hello},
        {"hi",cmd_hi},
        {"exit",cmd_exit}
    };
    
    //查找命令
    cmd_t* my_find(string val) {
        
        for (int i = 0; i < sizeof(cmd_table)/sizeof(cmd_t); i++) {
            if (val==cmd_table[i].name) {
                cmd_t* temp = new cmd_t(cmd_table[i].name, cmd_table[i].func);
                return temp;
            }
        }
        return NULL;
    }
    
    int main() {
        string val;
        cmd_t *cmd_ptr;
        while (1) 
        {
            cin>>val;
            cmd_ptr = my_find(val);
            //触发回调事件
            if (cmd_ptr) 
            {
                //调用回调函数
                cmd_ptr->func();
            }
            else {
                printf("ERROR ,NO THIS CMD
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    使用jmeter进行接口测试
    jenkins默认插件
    【机器学习】关于PCA 昕
    雲瑞文件直链分享软件
    FOB离岸价
    【数据分享】某地区1959~2019年60年降雨量时间序列数据
    【数据分享】银行客户流失Bank Customer Churn数据
    【数据分享】糖尿病患者研究数据集
    【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
    C# Speech
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13426154.html
Copyright © 2011-2022 走看看