Я искал ответ на этот вопрос, но мне кажется, что его довольно сложно получить, что приводит меня сюда наконец.
Это синтаксис, который мы должны поставить & вправо перед указателем на членфункция.Например, здесь.
class Test;
typedef void (Test::*fpop)();
class Test
{
public:
void Op1(){}
};
int main(){
fpop pFunc;
pFunc = &Test::Op1; // we must need the &
return 0;
}
Однако, когда я смотрю на ON_COMMAND (или любые другие сообщения) в MFC, он кажется немного отличным от того, что я считаю правильным.
VS6.0 все в порядке.Это следует правильному синтаксису, как вы видите ниже.Вы можете ясно видеть и раньше memberFxn.
#define ON_COMMAND(id, memberFxn) \ // VS6.0
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },
// ON_COMMAND(id, OnFoo) is the same as
// ON_CONTROL(0, id, OnFoo) or ON_BN_CLICKED(0, id, OnFoo)
Но в VS2008 это выглядит немного странно.MemberFxn не имеет & before.
#define ON_COMMAND(id, memberFxn) \ // VS2008
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \
static_cast<AFX_PMSG> (memberFxn) },
// ON_COMMAND(id, OnBar) is the same as
// ON_CONTROL(0, id, OnBar) or ON_BN_CLICKED(0, id, OnBar)
Более того, несмотря на отсутствие и memberFxn до и после, каждая строка ниже прекрасно работает.
- ON_COMMAND (ID_APP_ABOUT,CSingleApp :: OnAppAbout) // &
- ON_COMMAND (ID_APP_ABOUT, & CSingleApp :: OnAppAbout) // no &
Я попытался выяснить, почему, и мне было любопытно, может ли это бытьиз-за static_cast <> но оказалось, что static_cast не имеет к этому никакого отношения.
Поэтому мне интересно, почему в VS2008 у меня есть 2 варианта, где я помещаю & или мне не нужно ставить &.