我可以为某个对象定义一个类方法吗?
Can I define a class method for a certain objects?
假设我有一个类,它有一个空方法:
class Foo {
private:
Sprite spr;
public:
//...
void onLeftClick();
};
假设这个方法将在我点击精灵上的LMB时被调用。例如,现在我有两个Foo对象:
Foo first;
Foo second;
问题是,当我点击Foo对象所拥有的精灵之一时,我想"做点什么",但我想为每个特定对象编写不同的"响应"。例如,一个对象将在点击时显示文本,第二个对象将播放声音,第三个对象将使精灵移动到某个位置,然后播放声音,然后精灵将返回其开始位置。有很多事情要做……
我知道我在这里可能需要一些脚本语言,如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);
}
};
然后,当你创建精灵时,你可以添加任何你喜欢的处理程序,只要它是可调用的兼容签名。例如,使用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::signals2
或libsigc++
,而不是滚动自己的。
c++是一种静态类型语言。这意味着所有类型都在编译时定义。对象的INSTANCE发生在执行时间。
所以从本质上讲,c++并不是为特定对象设计方法的!如果你想做这样的事情,Tristan Brindle的答案是一个很好的方法。在动态类型语言的"低级"中,类似的事情正在发生。例如,你可以有一个函数映射,你可以调用myInstance.callFuncion["myMethodX"]()
。你找到了一种方法来"动态化"一个对象的方法数量……: -)
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 在类定义之后定义一个私有方法
- 如何制作一个将函数作为参数的类方法
- 在另一个类视图中添加最多2个图表的正确方法是什么
- Qt将信号与另一个类方法连接
- 将一个类的方法指针存储到另一个类中
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 如何在另一个类中使用类成员的正确方法?
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 创建一个类方法模板,该模板将使用稍后实现的函数
- 如何转换一个类方法以修改另一个类的私有元素?
- 一个类的成员变量可以用在另一个类方法中吗
- 一个类方法通过函数指针调用另一个类方法
- 通过引用另一个类方法传递向量成员变量
- 将类成员 (Map) 的指针作为默认参数传递给另一个类方法
- 如果open()在另一个类方法中,则流的C++无法写入
- 我可以为某个对象定义一个类方法吗?
- 在另一个类方法中运行类方法