作者cole945 (躂躂..)
看板C_and_CPP
標題Re: [問題] 關於 MFC 小問題
時間Fri May 22 01:11:24 2009
※ 引述《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