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

Can I define a class method for a certain objects?

本文关键字:一个 类方法 对象 定义 我可以      更新时间:2023-10-16

假设我有一个类,它有一个空方法:

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::signals2libsigc++,而不是滚动自己的。

c++是一种静态类型语言。这意味着所有类型都在编译时定义。对象的INSTANCE发生在执行时间

所以从本质上讲,c++并不是为特定对象设计方法的!如果你想做这样的事情,Tristan Brindle的答案是一个很好的方法。在动态类型语言的"低级"中,类似的事情正在发生。例如,你可以有一个函数映射,你可以调用myInstance.callFuncion["myMethodX"]()。你找到了一种方法来"动态化"一个对象的方法数量……: -)