推 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