Re: [問題] 關於 MFC 小問題

看板C_and_CPP (C/C++)作者 (躂躂..)時間16年前 (2009/05/22 01:11), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《stellvia7 (stellvia)》之銘言: : 我看visual studio wizard 做出來的 視窗中的一行code : ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) : ^^^^ : 為什麼要加上 & 符號阿 : 我看書上沒有加&符號說 : ps. 書Ivor Horton 寫的 正確來說, 這應該叫 "pointer to member function", 或叫 "pointer to method" 依 C++ 的 spec 規定 (5.3.1 Unary operators, 第3條) pointer-to-member (不管是 to data member或to member function) 一定要加 &, 而且不能加括號.. 舉例來說 clas MyClass { void mem(); }; 只有 &MyClass::mem 是可接受的 而 &(MyClass::mem) 與 MyClass::mem 都不合法.. 也就是說, 這與 void function() 時, function 與 &function, &(function) 都代表該 function 的 address 是不同的 而 ON_COMMAND( ... ) 的設計與運作大略是這個樣子: /* BaseWindows 會對應到 MFC 的 CCmdTarget */ class BaseWindow { public: int i; }; /* MyWindows 也就是你自己的 Window */ class MyWindow: public BaseWindow { public: /* cmd1 與 cmd2 就是像 OnFileNew 之類的event handler */ void cmd1() { printf("%d\n", i*2); } void cmd2() { printf("%d\n", i*3); } }; typedef void (BaseWindow::*WNDFX)(void); int main() { WNDFX fx; MyWindow mw; mw.i = 13; BaseWindow *bw = &mw; /* 這裡的 fx = &MyWindow::cmd 其實就是 ON_COMMAND 在做的事了*/ fx = static_cast<WNDFX>(&MyWindow::cmd1); (bw->*fx)(); // 印出 i*2 fx = static_cast<WNDFX>(&MyWindow::cmd2); (bw->*fx)(); // 印出 i*3 } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.194.146 ※ 編輯: cole945 來自: 140.112.194.146 (05/22 01:12)

05/22 05:05, , 1F
原來是這樣啊,終於懂為什麼了
05/22 05:05, 1F

05/22 09:13, , 2F
推清楚的解釋:)
05/22 09:13, 2F
※ 編輯: cole945 來自: 140.112.30.84 (05/22 10:28)

05/22 11:09, , 3F
那請問一下沒加&,是代表什麼意思??
05/22 11:09, 3F

05/22 13:30, , 4F
non-static method的話,不加&什麼都不是. static method
05/22 13:30, 4F

05/22 13:31, , 5F
的話, 就跟function一樣,加不加都可以..
05/22 13:31, 5F

05/22 13:31, , 6F
如果是data member的話, 不加& 就直接代表他的value囉..
05/22 13:31, 6F

05/22 14:03, , 7F
所以原PO提到書上沒加&,是因為是static method嗎?? QQ
05/22 14:03, 7F

05/22 15:42, , 8F
我覺得應該不是orz 應該VC6的餘毒..語法不嚴謹加上C++才
05/22 15:42, 8F

05/22 15:42, , 9F
定沒多久.. orz
05/22 15:42, 9F
文章代碼(AID): #1A5Oiz-O (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1A5Oiz-O (C_and_CPP)