话不多说,上来就是一段代码,之后解释
#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中,在需要发送消息的时候直接调用该函数即可,不必关心具体实现。
以上即回调函数,函数指针的精华部分。喜欢点个关注(*^▽^*)