gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:40:45 25 4
gpt4 key购买 nike

假设我有一个类,例如:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com