c ++:无法理解消息处理程序

Nix*_*xiN 0 c++ function-pointers

实际上我是编写处理程序的新手,但不知怎的,我设法编写了这段代码:

#include<iostream>

using namespace std;

class test
{
public:
typedef void (test::*MsgHandler)(int handle);

test()
{
    cout<<"costructor called"<<endl;
}

void Initialize()
{
    add_msg_Handler(4,&test::System);
}

void System(int handle)
{
    cout<<endl<<"Inside System()"<<endl;
    cout<<"handle:"<<handle<<endl;
}

protected:
MsgHandler message[20];
void add_msg_Handler(int idx,MsgHandler handler)
{
    cout<<endl<<"Inside add_msg_Handler()"<<endl;
    cout<<"handler:"<<handler<<endl;
    message[idx]=handler;
    cout<<"message:"<<message[idx]<<endl;
}
};

int main()
{
test obj;
obj.Initialize();

return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,我输出为:

costructor called

Inside add_msg_Handler()
handler:1
message:1
Run Code Online (Sandbox Code Playgroud)

但是我的范围之外还有一些事情.如果我是对的,应该在这一行中调用System():

add_msg_Handler(4,&test::System);
Run Code Online (Sandbox Code Playgroud)

但这不会发生.我需要帮助来纠正这个问题.

第二件事是,我无法理解为什么我得到这样的输出:

handler:1
Run Code Online (Sandbox Code Playgroud)

我的意思是处理程序如何初始化为1.可以帮助我解决这个问题?

mol*_*ilo 8

&test::System不是函数调用,它是指向成员函数的指针test::System.
(System(0)如果你将它用作有问题的参数,那么调用看起来就像编译一样.)

如果你看一下定义add_msg_handler:

cout<<endl<<"Inside add_msg_Handler()"<<endl;
cout<<"handler:"<<handler<<endl;
message[idx]=handler;
cout<<"message:"<<message[idx]<<endl;
Run Code Online (Sandbox Code Playgroud)

没有一个地方可以调用这个功能handler.
(电话看起来像(this->*handler)(0)(this->*message[idx])(0).)

因此,函数不会被调用,因为代码中没有任何东西可以调用它.

输出是1因为

  • handler 是指向成员函数的指针
  • <<指向成员函数的指针没有重载
  • 存在从指针到成员函数的隐式转换bool
  • 有过载<<bool
  • 非空指针被隐式转换为 true
  • true输出为1默认值.