看板 C_and_CPP 關於我們 聯絡資訊
QQ29:每次看到pointer to member function 就會想到有人問我04/08 23:43
QQ29:你要invoke 需要一個object or instance...那幹嘛不直接呼叫04/08 23:43
QQ29:就好~還喇一個pointer to member function...我答不出來...04/08 23:44
以剪頭髮為例 class 頭髮很長的顧客 { private: int 美金, 歐元, 台幣; public: int 用歐元付錢() { ... } int 用台幣付錢() { ... } int 用美金付錢() { ... } // ...略 }; typedef int (頭髮很長的顧客::*付款方式)(); // pointer to method void 剪頭髮(頭髮很長的顧客 &somebody, 付款方式 paymethod) { if ( (somebody.*paymethod)() > 0 ) { // 開始剪頭髮 } else { // 趕人 } } int main() { 頭髮很長的顧客 言承旭, 吳建豪, 朱孝天, 周渝民; 剪頭髮(朱孝天, &頭髮很長的顧客::用台幣付錢); 剪頭髮(朱孝天, &頭髮很長的顧客::用歐元付錢); // 就想剪兩次呀 return 0; } 上面這是語法。 Q. 那為什麼一定要寫成 class,不把 "付錢函數" 都寫成普通的 C Functions 就好? A. 財產要封裝成 private,所以需要 class,所以需要建物件 一定要把付錢函數寫成 method 的原因,如上面所述,那為什麼不要直接 『朱校天.用台幣付錢就好();』去呼叫就好,用什麼鬼外幣? 爽呀,有錢收就好,管人家用什麼幣。 以函數的角度來說,只要 signature 是 int (*)() 形式即可,具體要對應到哪個 method 是無法預測的,所以非得用 pointer to method 不可。 你怎麼可能一開始就預測到要呼叫哪個記憶體位址裡的 member function。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.138.253 蔡學鏞寫的兩篇「函數指標的進化論」跟此主題蠻搭的, C++ 傳統的 ptr to method/function,常應用在事件處理、callback。 JAVA 什麼都沒有,對應方案常用 Interface 解決。(當然這不是唯一的方法) C# 對於此,則新增了 delegate,相當於功能強一點的 ptr to method。 QT 則有 signal, slot 機制。 ※ 編輯: purpose 來自: 124.8.128.24 (04/09 09:15)
VictorTom:推:) 04/09 09:45
QQ29:謝謝,讓程式更彈性 04/09 09:53
LPH66:推 F4 XD 04/09 11:02
yuanyu90221:感謝終於懂了 04/10 01:52