如何将指向 class 内成员的指针传递给外部 class?
How to pass pointer to a member within class to outer class?
我试图将指向 class(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);
}
};
但是编译器显示错误:
non-standard syntax; use '&' to create a pointer to member
我还尝试了其他组合,例如:
- this->handler.
- &this.handler.
- 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()
的公共基础 class 继承,这样您就可以传递对象 pointers/references。一个大概的想法:
#include <iostream>
class VisualBase {
public:
virtual void handler() = 0;
virtual ~VisualBase() = 0;
};
VisualBase::~VisualBase() {}
class Button : public VisualBase {
public:
void handler() override {}
void OnClick(VisualBase* caller) {
caller->handler();
}
};
class Dialog : public VisualBase {
public:
void handler() override {
std::cout << "Dialog::handler\n";
}
void render() {
Button button;
button.OnClick(this);
}
};
int main() {
Dialog d;
d.render();
}
我试图将指向 class(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);
}
};
但是编译器显示错误:
non-standard syntax; use '&' to create a pointer to member
我还尝试了其他组合,例如:
- this->handler.
- &this.handler.
- 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()
的公共基础 class 继承,这样您就可以传递对象 pointers/references。一个大概的想法:
#include <iostream>
class VisualBase {
public:
virtual void handler() = 0;
virtual ~VisualBase() = 0;
};
VisualBase::~VisualBase() {}
class Button : public VisualBase {
public:
void handler() override {}
void OnClick(VisualBase* caller) {
caller->handler();
}
};
class Dialog : public VisualBase {
public:
void handler() override {
std::cout << "Dialog::handler\n";
}
void render() {
Button button;
button.OnClick(this);
}
};
int main() {
Dialog d;
d.render();
}