回调函数妙用-函数指针

40 篇文章 7 订阅
19 篇文章 0 订阅

话不多说,上来就是一段代码,之后解释


#include "stdafx.h"

//定义回调函数类型
typedef void(*_CALLBACK)(void *pUser);

//设置回调函数
void gFunc(_CALLBACK fun,void *pUser)
{
    fun(pUser);
}

//测试类
class Test
{
public:
    Test():m_nId(666)
    {
    
    }
     static void MyTest(void *pUser)
    {
        if(pUser)
        {
            printf("%d \n",((Test*)pUser)->m_nId); //可以直接访问类的私有成员
        }
    }
private:
    int m_nId;
};

int main(int argc, _TCHAR* argv[])
{
    Test test1;
    gFunc(&Test::MyTest,&test1);
    return 0;
}

这套代码看起来其实像脱裤子放屁,设置了回调又自己调用。还不如直接Test::MyTest(&test1)来的简单粗暴。实际上在项目中,有时候我们并不知道函数具体实现细节,甚至函数的真实名称也不知道,只知道有个地方保留了指向某个函数的指针,知道参数、返回值约定,知道函数作用仅此三点而已。


实际应用的场景:


程序有两个模块,一个dll以及exe,其中dll负责网络通信
假设我们只负责exe的开发,dll是其他部门提供的
其中,dll提供了一个类型的函数指针。定义如下:

typedef void  (*MessageFunc)(int nMsgType,stData data);//返回值为空,参数为int,stData,这里暂不追究stData到底是什么数据结构


并且dll只提供了一个导出函数

bool InitNetDll(MessageFunc getMsg,MessageFunc& sendMsg)

具体作用:

第一个参数是将自己的消息处理函数以指针的形式传入到dll中,当dll收到消息时,会整理成相应的格式,然后回调该函数,该函数的所有逻辑都在exe中实现了(一种注册机制)。
第二参数是函数指针的引用,目的是获取dll中发送消息的函数地址,将该函数的地址保存到exe中,在需要发送消息的时候直接调用该函数即可,不必关心具体实现。

以上即回调函数,函数指针的精华部分。喜欢点个关注(*^▽^*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值