0

我正在尝试将指向类成员(Dialog::handler)的指针从其方法(在 Dialog::r​​ender 的范围内)传递给某个外部方法(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);
            }
        };

但是编译器显示错误:

非标准语法;使用 '&' 创建指向成员的指针

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

  • 这个->处理程序。
  • &this.handler。
  • 这个。*处理程序。
  • ETC

但显然他们失败了。

4

1 回答 1

3

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

但看起来您可能应该从具有 a 的公共基类继承,virtual void handler()以便您可以传递对象指针/引用。一个粗略的想法:

#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();
}
于 2019-10-01T18:27:59.203 回答