65,187
社区成员




昨天问了个回调注册 的问题,大家都说,c++没有注册这个概念,是windows的。
找了篇博客 ,看了会,有的地方没有搞懂。
这是博客内容.
CGameStart中有个CCommu 类指针,CCommu 中有函数指针数组。
CGameStart 里定义了一些静态函数指针。 Init函数 然后把这些指针,赋值给CCommu 的成员函数指针
数组。
最后以以下方式
if(pGame->pCommu->func_list[CB_MOVE] != NULL)//回调函数的触发
{
pGame->pCommu->func_list[CB_MOVE](pGame->pCommu->func_args[CB_MOVE]);
}
来调用 CGameStart 的成员函数。
问题:作者绕这么多弯子, 到底干嘛,直接调用CGameStart的函数即可, 感觉 回调注册,是否是闲着没事干,研究的技巧。。
我菜鸟,不懂作者意图,大神帮忙解答。
//def.h
#include <iostream>
#include <stdio.h>
using namespace std;
typedef enum
{
CB_MOVE = 0, //
CB_COMEBACK, //
CB_BUYEQUIIP, //
}cb_type;
typedef void(*cb_func)(void *);
class CCommu //模块类
{
public:
CCommu()
{
memset(func_list, 0, sizeof(cb_func) *(CB_BUYEQUIIP +1));
memset(func_args, 0, sizeof(void *) *(CB_BUYEQUIIP +1));
}
int reg_cb(cb_type type, cb_func func, void *args = NULL)//注册回调函数
{
if(type <= CB_BUYEQUIIP)
{
func_list[ type ] = func;
func_args[type] = args;
return 0;
}
}
public:
cb_func func_list[CB_BUYEQUIIP + 1] ; //函数指针数组
void * func_args[CB_BUYEQUIIP +1];
};
//Gamestart.h
#include "def.h"
class CGameStart
{
public:
CGameStart();
~CGameStart();
void Init();
void run();
void Execute();
//一些回调函数
void static Move(void *args);
void static Comeback(void *args);
void static Buyequip(void *args);
public:
CCommu *pCommu;
};
//Gamestart.cpp
#include "Gamestart.h"
CGameStart::CGameStart():pCommu(NULL)
{}
void CGameStart::Init() //初始化的时候,注册回调函数
{
pCommu = new CCommu;
pCommu ->reg_cb(CB_MOVE, Move , this);
pCommu->reg_cb (CB_COMEBACK, Comeback,this );
}
void CGameStart::run()
{
Init();
}
void CGameStart::Execute()
{
cout<<"callback funciton is running"<<endl;
}
CGameStart::~CGameStart()
{
if(pCommu != NULL)
{
delete pCommu;
pCommu = NULL;
}
}
void CGameStart::Move(void *args)
{
CGameStart *pGame = (CGameStart *)args;
pGame -> Execute();
}
void CGameStart::Comeback(void *args)
{
//char *str = (char *)args;
//cout << str <<endl;
}
//main.cpp
#include "Gamestart.h"
int main()
{
CGameStart *pGame = new CGameStart;
pGame -> run();
if(pGame->pCommu->func_list[CB_MOVE] != NULL)//回调函数的触发
{
pGame->pCommu->func_list[CB_MOVE](pGame->pCommu->func_args[CB_MOVE]);
}
return 0;
}
void ShutdownComputer()
{
//关机...
}
typedef bool (* Ok) ();
Ok _ok; //全局变量
void Register(Ok ok) //注册回调函数
{
_ok=ok;
}
void ShutdownComputer()
{
if( _ok() )
{
//关机...
}
else
{
//取消关机
}
}
bool func()
{
bool b;
//...一系列判断
if ( b /*符合关机条件*/)
{
return true;
}
else
{
return false;
}
}