指向类方法的函数指针作为参数
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
【讨论】:
以上是关于指向类方法的函数指针作为参数的主要内容,如果未能解决你的问题,请参考以下文章