上一篇做了RakNet 一个消息与一个函数的绑定,但实际上一个消息有时候会对应多个函数,这时候我们可以用Vector把消息处理函数存起来,然后当消息发过来的时候,循环执行所有的处理函数
在上一篇的源代码做了 添加Vector 的修改。
#include <iostream>
#include <windows.h>
#include<string>
#include <map>
#include <vector>
using namespace std;
enum GameMessage
{
GM_LoginReturn,
GM_getUserInfoReturn,
GM_EverydayDrawReturn,
GM_FriendExtendReturn
};
void getRequestLoginReturn()
{
cout<<"Slot0 getRequestLoginReturn"<<endl;
}
void getUserInfoReturn()
{
cout<<"Slot1 getUserInfoReturn"<<endl;
}
void getRequestEverydayDrawReturn()
{
cout<<"Slot2 getRequestEverydayDrawReturn"<<endl;
}
void getFriendExtendOpenReturn()
{
cout<<"Slot3 getFriendExtendOpenReturn"<<endl;
}
typedef void(*funct)(); //函数类型,代表返回值为空,参数为空的函数指针类型
map<unsigned long,vector<funct>> m_msgMap;
typedef map<unsigned long,vector<funct>> MSGMAP;
vector<funct> slotFuncVec; //一个信号对应的所有槽函数
void registerMessageHandle(unsigned long type,funct f);
void fireMessage(unsigned long type);
int main()
{
registerMessageHandle(GM_LoginReturn,&getRequestLoginReturn);
registerMessageHandle(GM_LoginReturn,&getRequestEverydayDrawReturn);
registerMessageHandle(GM_LoginReturn,&getFriendExtendOpenReturn);
registerMessageHandle(GM_getUserInfoReturn,&getUserInfoReturn);
registerMessageHandle(GM_EverydayDrawReturn,&getRequestEverydayDrawReturn);
registerMessageHandle(GM_FriendExtendReturn,&getFriendExtendOpenReturn);
cout<<"注册了 "<<m_msgMap.size()<<" 条消息"<<endl;
int msgCin;
while(1)
{
cout<<"输入事件ID:";
cin>>msgCin;
fireMessage(msgCin);
Sleep(10);
}
return 0;
}
void registerMessageHandle(unsigned long type,funct f)
{
slotFuncVec.clear();
MSGMAP::iterator typeIter=m_msgMap.find(type);
if (typeIter!=m_msgMap.end()) //原来有直接在对应type的vec后面插入
{
typeIter->second.push_back(f);
}
else
{
slotFuncVec.push_back(f);
m_msgMap.insert(pair<unsigned long,vector<funct> >(type,slotFuncVec));
}
}
void fireMessage(unsigned long type)
{
MSGMAP::iterator typeIter=m_msgMap.find(type);
if (typeIter==m_msgMap.end()) return;
//如果找到了这个注册消息,那么就执行这个消息对应的函数,因为一个消息可以对应多个函数,所以用vector把所有的函数存储,然后循环执行
for (int i=0;i<typeIter->second.size();i++)
{
((typeIter->second)[i])();
}
}
程序运行图: