指向 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
正如您在我的代码中看到的那样,我正在尝试为一个按钮创建一个 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