gpt4 book ai didi

c++ - 我可以为某些对象定义一个类方法吗?

转载 作者:行者123 更新时间:2023-11-30 01:46:29 26 4
gpt4 key购买 nike

假设我有一些类有一个空方法:

class Foo {
private:
Sprite spr;

public:
//...
void onLeftClick();
};

假设当我在 sprite 上单击 LMB 时将调用此方法。现在,例如,我有两个 Foo 对象:

Foo first;
Foo second;

问题是,当我点击我的 Foo 对象具有的那些 Sprite 之一时,我想“做某事”,但我想为每个特定对象编写不同的“响应”代码。例如,一个对象在被点击时会显示一段文字,第二个会播放声音,第三个会让 Sprite 移动到某个位置,然后播放声音,然后 Sprite 会回到它的起始位置。有很多事情要做...

我知道我在这里可能需要的是像 Lua 这样的脚本语言,但现在我真的不熟悉脚本。有没有办法只用 C++ 实现我想做的事情?

最佳答案

有几种方法可以做你想做的事,但对于初学者你可以尝试这样的事情:

class sprite
{
// Let's say the parameters are the coordinates of the click
using click_handler_t = std::function<void(sprite&, int, int)>;
click_handler_t click_handler;

std::string name;

public:
sprite(const std::string& name) : name{name} {}

const std::string& get_name() const { return name; }

void set_click_handler(click_handler_t new_handler) {
click_handler = new_handler;
}

void on_click(int x, int y) {
click_handler(*this, x, y);
}
};

然后当您创建您的 sprite 时,您可以添加您喜欢的任何类型的处理程序,只要它可以使用兼容的签名调用即可。例如,使用 lambda:

sprite s1{"Sprite1"};
s1.add_click_handler( [](sprite& s, int x, int y) {
std::cout << "Sprite " << s.get_name() << "clicked at ("
<< x << "," << y << ")\n";
});

或使用免费功能:

void sprite2_clicked(sprite& s, int x, int y)
{
// Some other action here
}

sprite s2{"Sprite 2"};
s2.add_click_hander(sprite2_clicked);

这实际上只是大多数 GUI 库使用的信号概念的一个非常非常基本的版本。如果您打算做这样的事情,我建议您使用适当的信号库,如 boost::signals2libsigc++ 而不是自己动手。

关于c++ - 我可以为某些对象定义一个类方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181341/

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