指向类方法的函数指针作为参数

Posted

技术标签:

【中文标题】指向类方法的函数指针作为参数【英文标题】:Function pointer to class method as argument 【发布时间】:2021-12-10 20:07:54 【问题描述】:

正如您在我的代码中看到的那样,我正在尝试为从另一个类调用函数的按钮创建一个 onClick 事件(我正在尝试创建我的自定义按钮类而不是使用 win32 默认用于测试)。

但即使这不会引发任何错误,它也不会调用给定的方法。

这是 Button.hpp

中的函数签名
void onClick(POINT pt, void (ButtonsHandler::*clicked)(void));

这是Button.cpp 内部的实现(使用clicked() throws C++ 表达式前面的明显调用的括号必须具有指向函数类型)

void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void)) 

    if (PtInRect(&textRect, pt) != 0) 
    
        clicked;
    

这就是我真正称呼它的地方

mainMenu.getPlay().onClick(pt, &ButtonsHandler::onPlay);

编辑:解决了谢谢大家 我只是没有创建一个 ButtonsHandler 对象来执行非静态函数 这是我遗漏的正确代码。

void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void)) 
    if (PtInRect(&textRect, pt) != 0) 
        ButtonsHandler bh;
        (bh.*clicked)();
    

【问题讨论】:

clicked; 是一个有效的表达式,但它不调用任何东西(假设您打算这样做)。 clicked(); 怎么样? this 指针怎么样?如果调用类方法,则必须将指针传递给类。你在哪里尝试这样做? @JeJo 是的。缺少指向ButtonsHandler 的实例指针(或其与Button 的未知关系)是另一个从公开信息中不清楚的问题。但是,无论如何:没有括号 - 没有电话。 ;-)(我假设添加括号可能会导致一个新的错误导致正确的方向) 【参考方案1】:

它只是不调用给定的方法!

必须调用传递的pointer to member function 才能生效。

我假设Button 继承自ButtonsHandler。然后,例如,您可以使用指向成员函数的指针调用 this 指针,如下所示:

void Button::onClick(POINT pt, void (ButtonsHandler::*clicked)(void)) 

    if (PtInRect(&textRect, pt) != 0) 
        (this->*clicked)();
        //^^^^^^^^^^^^^^^^^^
        // or
        // std::invoke(clicked, this) // need to include <functional> header(Since C++17)
    


如果两个类不相关,则需要ButtonsHandler 的实例来调用成员函数。例如:

ButtonsHandler obj;
(obj.*clicked)();
// or
// std::invoke(clicked, obj) // need to include <functional> header

【讨论】:

以上是关于指向类方法的函数指针作为参数的主要内容,如果未能解决你的问题,请参考以下文章

模板函数将参数函数指针指向类方法

如何声明一个作为类成员的函数并返回指向线程的函数指针?

C++基础之类和对象二

指向任意类方法的模板非类型指针

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

C++函数指针与成员函数指针