當我們要進行訊息處理的時候,通常需要寫出一系列的訊息函數,然後再將這些函數指標賦值給一個函數指標數組。當要使用的時候,根據訊息編號確定在數組中的位置。 在C++中,成員函數指標寫著很不順手。。於是做了一個基類。。這個基類有個限制,就是只能處理兩個參數的訊息處理函數。
第一個是訊息ID,第二個就是訊息內容。不過多數情況下已經夠用。。。
#include "stdafx.h"<br />#include <iostream><br />#include <stdio.h><br />#include <assert.h><br />enum EDataType<br />{<br /> eData0,<br /> eData1,<br /> eData2,<br /> eData3,<br /> eData4,<br /> eData5,<br /> eData6,<br /> eData7,<br /> eData8,<br /> eDataCnt<br />};<br />template <class __T_,int _MAX_NUM = 100><br />class CMsgBase<br />{<br /> typedef void (__T_::*ProcFunc)(void* pData);<br />public:<br /> CMsgBase()<br /> {<br /> for(int i = 0; i< _MAX_NUM;++i)<br /> {<br /> mDataOpList[i] = NULL;<br /> } </p><p> }<br /> void ProcMsg(int dataType,void* pData)<br /> {<br /> assert(dataType<_MAX_NUM);<br /> if(mDataOpList[dataType])<br /> (((__T_*)this)->*mDataOpList[dataType])(pData);<br /> } </p><p> void Register(int dataType,ProcFunc fn)<br /> {<br /> assert(dataType<_MAX_NUM);<br /> mDataOpList[dataType] = fn;<br /> }<br />protected:<br /> ProcFunc mDataOpList[_MAX_NUM];<br />}; </p><p>class CMsgHandler:public CMsgBase<CMsgHandler,eDataCnt><br />{<br />public:<br /> CMsgHandler()<br /> {<br /> Register(0,&CMsgHandler::Func1);<br /> }<br /> virtual void Func1(void* pdata)<br /> {<br /> int p = *(int*)pdata;<br /> std::cout<<"Handler 0"<<p<<endl;<br /> } </p><p>}; </p><p>int main()<br />{<br /> CMsgHandler *b=new CMsgHandler;<br /> b->ProcMsg(0,b);<br /> delete b;<br /> getchar();<br />}
雖然是YY的,但至少執行正確。。。改天繼續YY。