当我们要进行消息处理的时候,通常需要写出一系列的消息函数,然后再将这些函数指针赋值给一个函数指针数组。当要使用的时候,根据消息编号确定在数组中的位置。 在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/geniusalex/
蛮牛专栏:麒麟子
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载:http://www.cnblogs.com/geniusalex/archive/2010/07/07/1940482.html
时间: 2024-12-29 02:17:12