YY了一个消息处理基类

简介:

当我们要进行消息处理的时候,通常需要写出一系列的消息函数,然后再将这些函数指针赋值给一个函数指针数组。当要使用的时候,根据消息编号确定在数组中的位置。 在C++中,成员函数指针写着很不顺手。。于是做了一个基类。。这个基类有个限制,就是只能处理两个参数的消息处理函数。

第一个是消息ID,第二个就是消息内容。不过多数情况下已经够用。。。

 

  1. #include "stdafx.h"     
  2. #include <iostream>     
  3. #include <stdio.h>     
  4. #include <assert.h>     
  5. enum EDataType     
  6. {     
  7.     eData0,     
  8.     eData1,     
  9.     eData2,     
  10.     eData3,     
  11.     eData4,     
  12.     eData5,     
  13.     eData6,     
  14.     eData7,     
  15.     eData8,     
  16.     eDataCnt     
  17. };     
  18. template <class __T_,int _MAX_NUM = 100>     
  19. class CMsgBase     
  20. {     
  21.     typedef void (__T_::*ProcFunc)(void* pData);     
  22. public:     
  23.     CMsgBase()     
  24.     {     
  25.         for(int i = 0; i< _MAX_NUM;++i)     
  26.         {     
  27.             mDataOpList[i] = NULL;     
  28.         }     
  29.     
  30.     }     
  31.     void ProcMsg(int dataType,void* pData)     
  32.     {     
  33.         assert(dataType<_MAX_NUM);     
  34.         if(mDataOpList[dataType])     
  35.         (((__T_*)this)->*mDataOpList[dataType])(pData);     
  36.     }     
  37.     
  38.     void Register(int dataType,ProcFunc fn)     
  39.     {     
  40.         assert(dataType<_MAX_NUM);     
  41.         mDataOpList[dataType] = fn;     
  42.     }     
  43. protected:     
  44.     ProcFunc mDataOpList[_MAX_NUM];     
  45. };     
  46.     
  47. class CMsgHandler:public CMsgBase<CMsgHandler,eDataCnt>     
  48. {     
  49. public:     
  50.     CMsgHandler()     
  51.     {     
  52.         Register(0,&CMsgHandler::Func1);     
  53.     }     
  54.     virtual void Func1(void* pdata)     
  55.     {     
  56.         int p = *(int*)pdata;     
  57.         std::cout<<"Handler 0"<<p<<endl;     
  58.     }     
  59.     
  60. };     
  61.     
  62. int main()     
  63. {     
  64.     CMsgHandler *b=new CMsgHandler;     
  65.     b->ProcMsg(0,b);     
  66.     delete b;  
  67.     getchar();     
  68. }   

虽然是YY的,但至少执行正确。。。改天继续YY。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/07/07/1940482.html

目录
相关文章
|
6天前
时间类:定义对象并输出特定时间
时间类:定义对象并输出特定时间
7 0
|
5月前
|
C++
C++中一个函数接收一个类对象时使用引用会怎样
其实传值时就相当于,使用类型对象B(实参)去给类型对象A(形参)初始化。是不是有点熟悉了? 没错就是拷贝构造函数做的事情。虽然AB类型不一致。但是创建B对象的类类型是创建A对象的类类型的派生类。 这种情况下并不会产生类型不匹配的错误。
31 0
|
2月前
MFC文档类视图接收字符串
MFC文档类视图接收字符串
9 0
|
17天前
|
C++
[C++/PTA] 派生类使用基类的成员函数
[C++/PTA] 派生类使用基类的成员函数
40 0
|
10月前
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
94 0
|
C++
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
【五、运算符重载实例分析】运算符重载实例、重载的机制、步骤、返回值及参数确定、友元函数与成员函数
69 0
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值
252 0
C#委托/Func()中 GetlnvocationList()方法的使用 | 接受委托多个返回值