c++ - 如何从鼠标处理程序中调用成员函数?

标签 c++ design-patterns event-handling

假设我有一个类,例如:

class IWavePlayer : public IControl
{
private:
    WDL_String mWavePath;

public:
    IWavePlayer() { 
        // some task
    }

    void LoadWave() {
        mWavePath = PromptForFile();
        // some task with mWavePath
    }
};

我主要使用 IWavePlayer pWavePlayer; 实例化它。

现在,我需要调用(在“处理”鼠标点击的另一个控件中)pWavePlayer 的函数 LoadWave():

class ICustomButton : public IControl
{
private:


public:
    ICustomButton()  {
        // some task
    }

    void ICustomButton::OnMouseDown(int x, int y, IMouseMod *pMod) {
        pWavePlayer.LoadWave();
    }
};

我不能在这里调用pWavePlayer.LoadWave();,因为显然它不“知道”pWavePlayer。而且我无法将 pWavePlayer 的实例传递给 ICustomButton(例如,因为它将特定于 1 个按钮)。

您通常如何处理这种情况?执行此操作的正确模式是什么?

最佳答案

当您需要从另一个对象的不相关成员函数调用一个对象的成员函数时,您需要为调用者提供指向目标的引用或指针。这通常在构造函数中完成:

class ICustomButton : public IControl {
private:
    IWavePlayer *pWavePlayer;
public:
    ICustomButton(IWavePlayer *wp) : pWavePlayer(wp)  {
        // some task
    }
    void ICustomButton::OnMouseDown(int x, int y, IMouseMod *pMod) {
        pWavePlayer->LoadWave();
    }
};

这也可以通过提供某种“定位器服务”或“注册表”来完成,通过它指向 IWavePlayer 的指针。可以在不提供任何引用的情况下找到。例如,如果只有一个 IWavePlayer在系统中,它可以成为一个单例,这意味着它可以在整个系统中作为 IWavePlayer::instance 访问。 .

如果您不想引用 IWavePlayer在你的ICustomButton完全可以使用 std::function添加另一层抽象:

class ICustomButton : public IControl {
private:
    std::function<void(void)> action;
public:
    ICustomButton(std::function& f) : action(f)  {
        // some task
    }
    void ICustomButton::OnMouseDown(int x, int y, IMouseMod *pMod) {
        action();
    }
};

现在创建按钮的调用者可以提供一个操作 std::function<void(void)> , 它可以嵌入对 pWavePlayer 的引用

这里有一个完整的例子来说明这个方法:

class Button {
    function<void(void)> action;
public:
    Button(function<void(void)> f) : action(f) {}
    void click() {
        action();
    }
};

class WavePlayer {
public:
    void load() {
        cout << "loaded" << endl;
    }
};

int main() {
    WavePlayer player;
    Button b([&] {
        player.load();
    });
    b.click();
    return 0;
}

Demo.

关于c++ - 如何从鼠标处理程序中调用成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37835696/

相关文章:

c++ - 函数参数列表中的函数调用是否加深了堆栈?

c++ - 搜索算法以查找列表中的 k 个最小值

design-patterns - Powershell 脚本 : recommended way to implement ShouldProcess when function calls are nested?

c++ - 如何阻塞线程并恢复它

java - 我可以通过字符串编译 C++ 源代码吗?

C++模板: one list by class,如何分解代码?

design-patterns - 存储库/延迟加载/持久性

javascript - 如何组织多个 View 使用的 Backbone 模型?

c# - 取消订阅事件 - 性能受到影响?

c# - ComboBox.SelectedIndexChanging?