C++ 指向另一个类函数成员的类成员函数变量

C++ 指向另一个类函数成员的类成员函数变量,c++,class,pointers,C++,Class,Pointers,你能解释一下为什么这段代码除了main()中的最后一行std::cout之外什么都没有显示吗?通过stackoverflow.com上的类似线程检查,无法将它们连接到我的线程,这是否合法?我尝试将一个类的函数指针设置为另一个类函数: #include <iostream> class container; class one { public: one() { eventsHandler = NULL; }; ~one() {}; voi

你能解释一下为什么这段代码除了main()中的最后一行std::cout之外什么都没有显示吗?通过stackoverflow.com上的类似线程检查,无法将它们连接到我的线程,这是否合法?我尝试将一个类的函数指针设置为另一个类函数:

#include <iostream>

class container;

class one {
public:
one() 
    { 
        eventsHandler = NULL; 
    };
~one() {}; 

void (container::*eventsHandler)();
};

class container {
public:
    container() 
    { 
        zone = new one;
        zone->eventsHandler = &container::events;
    };
    ~container()
    { 
        delete zone; 
    };

    one *zone;
    void events()
    {
        std::cout << "event handler is on..." << std::endl;
    };
};

int main()
{
    container *test = new container;
    test->zone->eventsHandler;

    std::cout << "just checker..." << std::endl;
    delete test;

    system("pause");
};
container *test = new container;
(test->*test->zone->eventsHandler)();
#包括
类容器;
一班{
公众:
一()
{ 
eventsHandler=NULL;
};
~1(){};
无效(容器::*eventsHandler)();
};
类容器{
公众:
容器()
{ 
分区=新分区;
zone->eventsHandler=&container::events;
};
~container()
{ 
删除区域;
};
一个*区;
作废事件()
{
std::cout eventsHandler;
std::cout您必须实际调用第38行中的函数指针,如下所示:

(test->*test->zone->eventsHandler)();

您应该使用
operator->*
调用成员函数指针,并将
test
指定为将被调用的对象

(test->*test->zone->eventsHandler)();
或者更清楚地说

(test->*(test->zone->eventsHandler))();

您需要提供一个对象来调用指向memeber函数的指针:

#include <iostream>

class container;

class one {
public:
one() 
    { 
        eventsHandler = NULL; 
    };
~one() {}; 

void (container::*eventsHandler)();
};

class container {
public:
    container() 
    { 
        zone = new one;
        zone->eventsHandler = &container::events;
    };
    ~container()
    { 
        delete zone; 
    };

    one *zone;
    void events()
    {
        std::cout << "event handler is on..." << std::endl;
    };
};

int main()
{
    container *test = new container;
    test->zone->eventsHandler;

    std::cout << "just checker..." << std::endl;
    delete test;

    system("pause");
};
container *test = new container;
(test->*test->zone->eventsHandler)();
在这里,
test
是对象,
test->zone->eventsHandler
是指向已保存的成员函数的指针,
operator->*
将它们连接起来

因此,它非常类似于任何其他成员函数;但是,您可以切换调用成员的对象:

container *first = new container;
container *second = new container;
(first->*second->zone->eventsHandler)();
// both pointers point to the same function
std::cout << (first->zone->eventsHandler == second->zone->eventsHandler) << std::endl;
container*first=新容器;
容器*second=新容器;
(第一->*第二->区域->事件处理者)();
//两个指针都指向同一个函数

Std:EdvsHundANDROL= =第二次>区域-> EndoShandLand)这足以导致编译错误,因为<代码>测试>区域>事件SeunDANDL/<代码>是对代码<容器>代码>的指针,而不是指向一个自由函数的指针。true,用于修复。大约10年前,我在C++中实际使用了成员函数指针,事情是这样的。有点生疏。非常感谢,这一个工作得很好,我无法意识到调用代码应该需要更多的作用域,没有得到类的完整概念::*函数在这里。第一个测试->是定义中的类,下面的取消引用只是指向指定区域函数参数的链接。抱歉,需要检查我是否正确理解此技术:)你们回复的速度之快给我留下了深刻的印象,再次感谢大家,@songyuanyao回复看起来对我有用:)