如何将指向 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

我还尝试了其他组合,例如:

但显然他们失败了。

您可以使用 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();
}