这几天在用CEGUI,学习了一下他的CALLBACK原理,写了一个小CASE
FOLLOWING IS IT:
FOLLOWING IS IT:
//
main.cpp : Defines the entry point for the console application.
//
#include " stdafx.h "
#include < string >
#include < iostream >
#include < map >
class MessageMap // 功能类,调用对象
{
public:
MessageMap()
{
}
~MessageMap()
{
}
int print(int para1,int para2)
{
std::cout<<"Para1="<<para1<<std::endl;
std::cout<<"para2="<<para2<<std::endl;
return 1;
}
int add(int para1,int para2)
{
std::cout<<"para1+para2="<<para1+para2<<std::endl;
return 1;
}
} ;
typedef int (MessageMap:: * MemberFunction)( int , int ); // Callback函数原型
class FuncCode // 函数的从属关系
{
public:
FuncCode(MessageMap* pObj,MemberFunction pFun)
{
obj=pObj;
fun=pFun;
}
public:
MessageMap* obj;
MemberFunction fun;
} ;
class SendMessage // 调用类
{
public:
SendMessage()
{
}
~SendMessage()
{
FunMapIterator itend=funmap.end();
for (FunMapIterator it=funmap.begin ();it!=itend;it++)
{
delete it->second;
}
funmap.clear ();
}
int addMessageFunction(std::string msg,int (MessageMap::*fun)(int,int),MessageMap* pobj)
{
funmap[msg]=new FuncCode(pobj,fun);
return 1;
}
int operator()(std::string msg,int para1,int para2)
{
return ((funmap[msg]->obj)->*(funmap[msg]->fun))(para1,para2);
}
protected:
typedef std::map<std::string,FuncCode*> FunMap;
typedef std::map<std::string,FuncCode*>::iterator FunMapIterator;
FunMap funmap;
} ;
int _tmain( int argc, _TCHAR * argv[])
{
MessageMap* pObj= new MessageMap();
SendMessage SendMsg;
{//初始化
SendMsg.addMessageFunction ("print",&MessageMap::print,pObj);
SendMsg.addMessageFunction ("add",&MessageMap::add,pObj);
}
{//调用
SendMsg("print",1,2);
SendMsg("add",1,2);
}
delete pObj;
return 0;
}
// 说明
// 1、这种调用可以用类模板扩展,其实这是一个CALLBACK简略版,有兴趣的话可以参考CEGUI源码,里面用的是类模板
// ,这样的话将不再受类型(MESSAGEMAP)的限制。
//
// 2、对于int addMessageFunction(std::string msg,int (MessageMap::*fun)(int,int),MessageMap* pobj)
// 的参数问题,主要说明int (MessageMap::*fun)(int,int)。
// 这是一个很有意思的参数,他的类型为int (MessageMap::*)(int,int),值为 fun,有兴趣的可以看看ASM的传参过程
// ,其实这里可以用MemberFunction fun代替,当然用模板的话会有所不同,参考CEGUI.
// 3.不要把typedef int (MessageMap::*MemberFunction)(int ,int ) 定义成
// typedef int (*MemberFunction)(int ,int ),这是代码的关键所在,一般的C++BOOK都会提及他们的不同之处。
//
#include " stdafx.h "
#include < string >
#include < iostream >
#include < map >
class MessageMap // 功能类,调用对象
{
public:
MessageMap()
{
}
~MessageMap()
{
}
int print(int para1,int para2)
{
std::cout<<"Para1="<<para1<<std::endl;
std::cout<<"para2="<<para2<<std::endl;
return 1;
}
int add(int para1,int para2)
{
std::cout<<"para1+para2="<<para1+para2<<std::endl;
return 1;
}
} ;
typedef int (MessageMap:: * MemberFunction)( int , int ); // Callback函数原型
class FuncCode // 函数的从属关系
{
public:
FuncCode(MessageMap* pObj,MemberFunction pFun)
{
obj=pObj;
fun=pFun;
}
public:
MessageMap* obj;
MemberFunction fun;
} ;
class SendMessage // 调用类
{
public:
SendMessage()
{
}
~SendMessage()
{
FunMapIterator itend=funmap.end();
for (FunMapIterator it=funmap.begin ();it!=itend;it++)
{
delete it->second;
}
funmap.clear ();
}
int addMessageFunction(std::string msg,int (MessageMap::*fun)(int,int),MessageMap* pobj)
{
funmap[msg]=new FuncCode(pobj,fun);
return 1;
}
int operator()(std::string msg,int para1,int para2)
{
return ((funmap[msg]->obj)->*(funmap[msg]->fun))(para1,para2);
}
protected:
typedef std::map<std::string,FuncCode*> FunMap;
typedef std::map<std::string,FuncCode*>::iterator FunMapIterator;
FunMap funmap;
} ;
int _tmain( int argc, _TCHAR * argv[])
{
MessageMap* pObj= new MessageMap();
SendMessage SendMsg;
{//初始化
SendMsg.addMessageFunction ("print",&MessageMap::print,pObj);
SendMsg.addMessageFunction ("add",&MessageMap::add,pObj);
}
{//调用
SendMsg("print",1,2);
SendMsg("add",1,2);
}
delete pObj;
return 0;
}
// 说明
// 1、这种调用可以用类模板扩展,其实这是一个CALLBACK简略版,有兴趣的话可以参考CEGUI源码,里面用的是类模板
// ,这样的话将不再受类型(MESSAGEMAP)的限制。
//
// 2、对于int addMessageFunction(std::string msg,int (MessageMap::*fun)(int,int),MessageMap* pobj)
// 的参数问题,主要说明int (MessageMap::*fun)(int,int)。
// 这是一个很有意思的参数,他的类型为int (MessageMap::*)(int,int),值为 fun,有兴趣的可以看看ASM的传参过程
// ,其实这里可以用MemberFunction fun代替,当然用模板的话会有所不同,参考CEGUI.
// 3.不要把typedef int (MessageMap::*MemberFunction)(int ,int ) 定义成
// typedef int (*MemberFunction)(int ,int ),这是代码的关键所在,一般的C++BOOK都会提及他们的不同之处。