YY了一个消息处理基类

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

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

 <textarea cols="50" rows="15" name="code" class="cpp">#include "stdafx.h" #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;assert.h&gt; enum EDataType { eData0, eData1, eData2, eData3, eData4, eData5, eData6, eData7, eData8, eDataCnt }; template &lt;class __T_,int _MAX_NUM = 100&gt; class CMsgBase { typedef void (__T_::*ProcFunc)(void* pData); public: CMsgBase() { for(int i = 0; i&lt; _MAX_NUM;++i) { mDataOpList[i] = NULL; } } void ProcMsg(int dataType,void* pData) { assert(dataType&lt;_MAX_NUM); if(mDataOpList[dataType]) (((__T_*)this)-&gt;*mDataOpList[dataType])(pData); } void Register(int dataType,ProcFunc fn) { assert(dataType&lt;_MAX_NUM); mDataOpList[dataType] = fn; } protected: ProcFunc mDataOpList[_MAX_NUM]; }; class CMsgHandler:public CMsgBase&lt;CMsgHandler,eDataCnt&gt; { public: CMsgHandler() { Register(0,&amp;CMsgHandler::Func1); } virtual void Func1(void* pdata) { int p = *(int*)pdata; std::cout&lt;&lt;"Handler 0"&lt;&lt;p&lt;&lt;endl; } }; int main() { CMsgHandler *b=new CMsgHandler; b-&gt;ProcMsg(0,b); delete b; getchar(); } </textarea>

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

你可能感兴趣的:(YY了一个消息处理基类)