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

目录
相关文章
|
16天前
|
C++
[C++/PTA] 派生类使用基类的成员函数
[C++/PTA] 派生类使用基类的成员函数
40 0
|
安全 程序员 编译器
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
127 0
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(上)
|
存储 Java C++
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
104 0
【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承(下)
|
设计模式 C++ 容器
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。
390 0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
|
C++
c++ 回调类成员函数实现
实现类成员函数的回调,并非静态函数;区分之 #ifndef __CALLBACK_PROXY_H_ #define __CALLBACK_PROXY_H_ ...
1375 0
|
Windows
WinForm重写事件函数
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/42777239 重写Windows的事件函数有利于捕捉更多的事件过程。
736 0