理解C++:C++ 回调函数

复习typedef

参考

两种使用情况:

1.typedef int myint_t; //在语句开头加上typedef关键字,myint_t就是我们定义的新类型
2.typedef void (PFunCallBack)(char pMsg, unsigned int nMsgLen);//一般应用在回调函数

typedef的第二种用法:
普通函数指针
定义函数:void printHello(int i);
定义函数指针:void (*pFunc)(int);
指向:pFunc = &printHello;
调用:(*pFunc)(110);
其中:void (*pFunc)(int) 是声明一个函数指针,指向返回值是void,调用参数是(int)的函数,变量名是pFunc,
typedef的函数指针
typedef重命名一个函数指针方法:typedef void (*PrintHelloHandle)(int);
用这个方法定义:PrintHelloHandle pFunc;
指向:pFunc = &printHello;
调用:(*pFunc)(110);
注意两者的区别:第一个直接定义pFunc,第二个使用typedef定义pFunc


回调函数

功能:传递函数过去(callback),然后调用函数(caller),满足条件之后再回过头调用传递的函数(callback)。

为什么要使用回调函数:可以满足两个函数的互相调用
和普通函数调用一样,只不过参数是函数指针,运行到回调函数部分之后,运行回调函数,然后再回来。
理解代码一:

#include <iostream>
typedef void (*Fun)(int);//定义一个函数指针类型
Fun p = NULL;//用Fun定义一个变量p,它指向一个返回值为空参数为int的函数
void caller(Fun pCallback)
{
    p = pCallback;
    //达成某一条件后,通过名片(函数指针p),传回结果
    int result = 1;
    (*p)(result);//开始回调
    std::cout << "caller part " << std::endl;//回调函数结束之后,还会回来
}
void callback(int a)//回调函数
{
    std::cout << "callback part " << std::endl;
    std::cout << "callback result = " << a << std::endl;
}
int main(int argc, char* argv[])
{
    caller(callback);
    return 0;
}

理解代码二:

#include <stdio.h>
typedef int student_id;
typedef int student_age;
typedef struct _Student{
    student_id id;
    student_age age;
}Student;

//类型重定义:函数指针类型
typedef bool (*pFun)(Student, Student);
//-----------------------------------------------
//冒泡排序法:能够按AGE或ID排序,用同一个函数实现
//-----------------------------------------------
void sort(Student stu[],const int num,pFun fun)
{
    Student temp;
    
    for(int i = 0; i < num; ++i){
        for(int j = 0; j < num - i -1; ++j)
        {
            if((*fun)(stu[j],stu[j+1]))//开始回调
            {
                temp = stu[j];
                stu[j] = stu[j+1];
                stu[j+1] = temp;
            }
        }
    }
}

//-----------------------------------------------
//回调函数:比较年龄
//-----------------------------------------------
bool CompareAge(Student stu1,Student stu2)
{
    //更改从大到小还是从小到大的顺序,只需反一下。
    if(stu1.age < stu2.age)
        return true;
    return false;
}
//-----------------------------------------------
//回调函数:比较
//-----------------------------------------------
bool CompareId(Student stu1,Student stu2)
{
    //更改从大到小还是从小到大的顺序,只需反一下。
    if(stu1.id < stu2.id)
        return true;
    return false;
}

int main()
{
    Student stu[] = {
    {1103,24},
    {1102,23},
    {1104,22},
    {1107,25},
    {1105,21}};
    
    pFun fun = CompareAge;
    int size = sizeof(stu)/sizeof(Student);
    
    sort(stu,size,fun);
    
    for(int i = 0; i < size; ++i){
        printf("%d %d\n",stu[i].id,stu[i].age);
    }
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值