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

Function pointer to class method as argument

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

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

这是Button.hpp

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

这是Button.cpp里面的实现(使用clicked() throws C++ expression preceding the parenthes of apparent call must have pointer-to function type)

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)();
    }
}

It just doesn't invoke the given method!

传递的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