看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
zlw:原來是這樣啊,終於懂為什麼了 05/22 05:05
VictorTom:推清楚的解釋:) 05/22 09:13
※ 編輯: cole945 來自: 140.112.30.84 (05/22 10:28)
Cloud:那請問一下沒加&,是代表什麼意思?? 05/22 11:09
cole945:non-static method的話,不加&什麼都不是. static method 05/22 13:30
cole945:的話, 就跟function一樣,加不加都可以.. 05/22 13:31
cole945:如果是data member的話, 不加& 就直接代表他的value囉.. 05/22 13:31
Cloud:所以原PO提到書上沒加&,是因為是static method嗎?? QQ 05/22 14:03
cole945:我覺得應該不是orz 應該VC6的餘毒..語法不嚴謹加上C++才 05/22 15:42
cole945:定沒多久.. orz 05/22 15:42