如果我們要根據不同的「命令」來執行不同型別的函式要怎麼辦呢? (這裡的不同指的是執行函式的返回值可能不同,引數列表可能不同。)。好,我們下面就開始討論這個問題。
可能這篇比上篇會難一點,拿出你程式設計師的毅力來。想想搞定了以後,我們就可以在程式中使用這種手法,可以明白mfc的訊息對映表機制(其實這裡非常類似於mfc的訊息對映機制),還可以拓展自己的設計思路,提高自己的設計水平。最重要的是,使用它能夠為你的程式帶來好處。ok, let's go!
***.h 檔案
1、首先,要把 "命令" 和 "函式" 對應起來,map是必不可少的,函式指標也是不能少的,而命令是 cstring 型別的,所以我們在類裡寫下這兩個東西。
如下:class cparser
2、我們現在是要執行不同型別的函式,上面的函式指標只是一種型別(返回值為void, 引數列表為void)。
所以,這裡要定義各種型別的函式指標。
而且還需要乙個enum結構來標示我們需要的函式型別。(因為函式指標都是4個位元組的,可以說是無型別的,我們要另外定義型別來標示它,以便能判斷選擇),好,思路有了,趕快寫下來:
// 要前置宣告一下,因為下面這些**不寫在類裡了,寫在類的外頭/前面
class cparser;
typedef void (cparser::*funcpointer)(void);
// 定義乙個 union 結構來裝各種的函式指標
// 實際這裡是使用 union 來做轉換
// 因為函式指標在 union cmdfunctions 中定義,都是 4 bytes,
// 所以利用 union 的特性可順利做轉換
union cmdfunctions
;// 定義乙個 enum 結構來標示我們的函式型別
enum func_type
;3、好了,寫下了上面兩個關鍵的東西,我們要考慮一下,如何使用map把命令和函式指標對應起來了。
由於stl map只有兩個引數,所以,我就要自定義乙個結構放進map的第二個引數中去,這個結構包括了函式指標,函式型別,那我們下面就可以根據命令找到這個結構體,然後根據結構體中的函式型別呼叫相應的函式指標了。嗯,寫下來:
// 在類的外頭再定義乙個結構體
typedef struct functioninfo
funcinfo;
// 在類裡
class cparser
好了,該定義的變數、結構等等的都搞定了,我們可以到 cpp 檔案建立表和嘗試利用命令來呼叫函式了。
***.cpp 檔案
1、首先建表,在建構函式中
cparser::cparser()
由於map的限制,這裡很難寫成巨集,可以寫成函式,稍微簡化一下。在mfc中是對每個不同的 on_*** 巨集作不同的函式指標型別對應,這裡不展開說明。
我們寫乙個函式來簡化和統一建表操作。
void cparser::setcmdmap(lpctstr strcmd, enum func_type ft, funcpointer pfn)
那我們的建表就可以簡化成:
cparser::cparser()
2、根據命令找到相應的函式並執行
我們下面就可以根據命令來尋找表中對應的函式了。**如下,和上篇的**差不多,就是多了個函式指標型別的判斷選擇 switch-case。
void cparser::execcmd(cstring &strcmd, cstring &strparam)
}else
}3、寫上對應的函式
void cparser::methoda(cstring &strparam)
void cparser::methodb(cstring &strparam, int nparam)
4、寫個函式測試一下這個表
void cparser::onbutton1()
經過第4步的測試,顯然結果是正確的。到這裡,我們實現了更高階的「命令對映表」,可以執行不同型別的函式了。
看到這裡,希望你能明白這種設計方法。我也累了。。。。。。
實現自己的「命令對映表」 下
如果我們要根據不同的 命令 來執行不同型別的函式要怎麼辦呢?這裡的不同指的是執行函式的返回值可能不同,引數列表可能不同。好,我們下面就開始討論這個問題。可能這篇比上篇會難一點,拿出你程式設計師的毅力來。想想搞定了以後,我們就可以在程式中使用這種手法,可以明白mfc的訊息對映表機制 其實這裡非常類似於...
路由對映表的配置
實驗一 使用路由對映表過濾路由更新 實驗步驟及要求 1.配置各台路由器的ip位址。2.配置ospf與rip v2的協議,並關閉rip v2的自動彙總。3.在r2上配置路由重分發 r2 config router ospf 1 r2 config router redistribute rip met...
Go語言中對映表map的使用
go語言中的鍵值對 key value 集合,稱之為對映map。對映map是變長型別,定義時不需要指定長度。對映map是無序的,遍歷是的順序不可期,原因是底層由hash表實現。邏輯結構表示為 var m map key type value type var m make map key type ...