【问题标题】: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 的未知关系)是另一个从公开信息中不清楚的问题。但是,无论如何:没有括号 - 没有电话。 ;-)(我假设添加括号可能会导致一个新的错误导致正确的方向)

标签: c++ oop winapi member-function-pointers function-call


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多