我正在尝试将指向类(Dialog :: handler)的成员的指针从其方法(在Dialog :: render的范围内)传递给某个外部方法(Button :: OnClick)。
这里是一个小例子:
class Button
{
public:
void OnClick(void (*handler)())
{
handler();
}
};
class Dialog
{
public:
void handler()
{
//do stuff
}
void render()
{
auto button = new Button;
//Source of problem
button->OnClick(this->*handler);
}
};
但是编译器显示错误:
非标准语法;使用“&”创建指向成员的指针
我也将其他组合都混为一谈,例如:
但是显然他们失败了。
您可以使用std::function
并传递一个lambda,在其中捕获了您要回调的对象this
:
#include <functional>
#include <iostream>
class Button {
public:
void OnClick(std::function<void()> handler) {
handler();
}
};
class Dialog {
public:
void handler() {
std::cout << "Dialog::handler\n";
}
void render() {
auto button = new Button;
// a lambda catching "this" Dialog.
button->OnClick([this] { this->handler(); });
delete button; // you didn't delete your button
}
};
int main() {
Dialog d;
d.render();
}
但是看起来您可能应该继承自具有virtual void handler()
的通用基类,因此可以改为传递对象指针/引用。