有幾個方法可以做到你想要什麼,但對於初學者,你可以嘗試這樣的事:
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 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++
,而不是自己動手。
不需要_scripting language_,爲'Foo'的特定實例注入lambda函數。 –
現在閱讀關於lambda函數。我會看看它是否會工作。謝謝! – mentor93
閱讀關於'std :: function'也應該有所幫助。 –