假设我有一个类,例如:
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;
}
关于c++ - 如何从鼠标处理程序中调用成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37835696/