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

时间: 2024-12-29 02:17:12

YY了一个消息处理基类的相关文章

Duilib学习笔记《06》— 窗体基类WindowImpBase

在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等-所以,能不能创建一个公有的窗体基类呢?其实,在duilib中已经提供了一个窗体基类 WindowImplBase:在基类内搭建窗口的消息框架,各处理函数为虚函数,子类可以重载处理函数,实现其处理. 此处我们以修改之前的代码为例来进行说明. 1. 窗体显示 CMainWndDlg类修改为继承Windo

《Effective C++》读书笔记07:为多态基类声明virtual析构函数

这个问题在实践中偶尔会碰到,设计一个TimeKeeper基类和一些派生类来记录时间: 1 class TimeKeeper 2 { 3 public: 4 TimeKeeper (); 5 ~TimeKeeper(); 6 7 }; 8 9 class AtomicClock: public TimeKeeper {}; //原子钟 10 class WaterClock: public TimeKeeper {}; //水钟 在使用时,我们可能会使用factory工厂方法: 1 TimeKee

Effective C#原则29:仅在对基类进行强制更新时才使用new修饰符

你可以用new修饰符来重新定义一个从基类中继承来的非虚成员.你可以这样 做,但并不意味着需要这样做.重新定义非虚方法会导致方法含意的混乱.如果 两个相关的类是继承关系,那么很多开发人员可能会立即假设两段代码块是做完 全相同的事情,而且他们也会这么认为: object c = MakeObject( ); // Call through MyClass reference: MyClass cl = c as MyClass; cl.MagicMethod( ); // Call through

绑定子类的泛型基类,反模式?

 这次总结一个个人认为的反模式:"绑定子类的泛型层基类",这个模式在一些著名的框架中也见到过,如果CSLA.BlogEngine.我自己在原来的写的框架中,也用到过.     当然了,个人认为是反模式,各们同仁并不一定这样认为,仁者见仁,智者见智了.不过我好几次都是受尽折磨,所以决定写出来给大家分享下心得.   模式介绍     "层基类"是MF提出的一个基本模式,详见:<Layer Supertype>.这种模式在经典的层次型架构设计的实现中,是极其重

派生-运用虚基类对公司员工管理系统 的实现

问题描述 运用虚基类对公司员工管理系统 的实现 设计一个利用文件处理方式实现对公司人员(包括工程师.领导和主任工程师)进行管理,要求具有增加数据.更新数据.查询数据.删除数据以及实现数据的功能. 实现提示: 设计一个虚基类Staff(员工),包含编号.姓名和年龄保护数据成员以及相关的成员函数:由Staff派生出工程师类Engineer,包含专业和职称保护数据成员以及相关的成员函数:再由Staff派生出领导类Leader,包含职务和部门保护数据成员以及相关的成员函数:然后由Engineer和Lea

求教前辈 c++ ,关于纯虚基类

问题描述 求教前辈 c++ ,关于纯虚基类 using std::cout; using std::cin; using std::endl; class A { public: virtual void show()const= 0; virtual void show()= 0; }; class B :public A { public: virtual void show() { cout << "存在 const" << endl;} virtual

虚函数、抽象类及虚基类

虚函数.抽象类及虚基类 虚函数及抽象类: 派生类经常(但不总是)覆盖它继承的虚函数.如果没有覆盖,派生类会直接继承其在基类中的版本. 派生类可以在它覆盖的函数前使用virtual关键字,但不是非得这么做. C++11允许派生类使用override关键字,显式地注明它重写了基类中的某个虚函数. 常见的不能声明为虚函数的有:非成员函数(含友元函数):静态成员函数:构造函数. 1.为什么C++不支持普通函数和友元函数为虚函数? 它们不能被继承. 2.为什么C++不支持构造函数为虚函数? 构造函数不能被

(一四一)抽象基类

抽象基类(abstract base class,简称ABC).   抽象基类的前提是,类方法里有 纯虚函数(pure virtual function). 纯虚函数需要在函数声明的结尾处添加"=0".   当一个类有了纯虚函数之后,它就成为了一个抽象基类. 抽象基类的特点是,不能创造该类的对象.   例如B类和C类的有一定的共同点,把这些共同点(数据成员和方法)抽象出来,创建一个A类,而B类和C类都从A类派生出来.而A类有一个纯虚函数,因此A类就成为了一个抽象基类.   对于纯虚函数

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派