Re: [問題] 關於 MFC 小問題
※ 引述《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
05/22 13:30, 4F
→
05/22 13:31, , 5F
05/22 13:31, 5F
→
05/22 13:31, , 6F
05/22 13:31, 6F
→
05/22 14:03, , 7F
05/22 14:03, 7F
→
05/22 15:42, , 8F
05/22 15:42, 8F
→
05/22 15:42, , 9F
05/22 15:42, 9F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章