当我们要进行消息处理的时候,通常需要写出一系列的消息函数,然后再将这些函数指针赋值给一个函数指针数组。当要使用的时候,根据消息编号确定在数组中的位置。 在C++中,成员函数指针写着很不顺手。。于是做了一个基类。。这个基类有个限制,就是只能处理两个参数的消息处理函数。
第一个是消息ID,第二个就是消息内容。不过多数情况下已经够用。。。
#include "stdafx.h" #include <iostream> #include <stdio.h> #include <assert.h> enum EDataType { eData0, eData1, eData2, eData3, eData4, eData5, eData6, eData7, eData8, eDataCnt }; template <class __T_,int _MAX_NUM = 100> class CMsgBase { typedef void (__T_::*ProcFunc)(void* pData); public: CMsgBase() { for(int i = 0; i< _MAX_NUM;++i) { mDataOpList[i] = NULL; } } void ProcMsg(int dataType,void* pData) { assert(dataType<_MAX_NUM); if(mDataOpList[dataType]) (((__T_*)this)->*mDataOpList[dataType])(pData); } void Register(int dataType,ProcFunc fn) { assert(dataType<_MAX_NUM); mDataOpList[dataType] = fn; } protected: ProcFunc mDataOpList[_MAX_NUM]; }; class CMsgHandler:public CMsgBase<CMsgHandler,eDataCnt> { public: CMsgHandler() { Register(0,&CMsgHandler::Func1); } virtual void Func1(void* pdata) { int p = *(int*)pdata; std::cout<<"Handler 0"<<p<<endl; } }; int main() { CMsgHandler *b=new CMsgHandler; b->ProcMsg(0,b); delete b; getchar(); }
虽然是YY的,但至少执行正确。。。改天继续YY。
作者:麒麟子 出处:http://www.cnblogs.com/qilinzi/ 蛮牛专栏:麒麟子 简介:麒麟子,编程15年,科技创始人,技术作家。 09年进入游戏行业,16年创立成都幼麟科技有限公司。十年从业经验练就了游戏全栈技能,目前专注于手机游戏领域。 版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。