2015-10-17 66 views
1

比方說,我有一些類有一個空的方法:我可以爲某些對象定義類方法嗎?

class Foo { 
    private: 
     Sprite spr; 

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

比方說,這種方法將被調用,當我點擊精靈LMB。現在,我已經,例如兩個富對象:

Foo first; 
Foo second; 

的事情是,我想「做什麼」,當我點擊這些精靈我的Foo對象有一個,但我想代碼每個特定對象都有不同的「響應」。例如,一個對象在點擊時會顯示一個文本,第二個會播放聲音,第三個會讓精靈移動到某個位置,然後播放聲音,然後精靈將返回到開始位置。這是多種多樣的事情要做...

我知道我可能需要的是一些像Lua這樣的腳本語言,但是現在我真的不熟悉腳本。有沒有辦法在C++中實現我想要的功能?

+0

不需要_scripting language_,爲'Foo'的特定實例注入lambda函數。 –

+0

現在閱讀關於lambda函數。我會看看它是否會工作。謝謝! – mentor93

+0

閱讀關於'std :: function'也應該有所幫助。 –

回答

4

有幾個方法可以做到你想要什麼,但對於初學者,你可以嘗試這樣的事:

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::signals2libsigc++,而不是自己動手。

+0

這有點太嚴格,因爲它需要on_click事件的特定簽名。 –

+0

@bku_drytt它的確如此,但這是GUI庫使用的標準模式。你會如何建議採取不同的方式? –

0

C++是一種靜態類型語言。這意味着所有類型都在編譯時間處定義。 對象的實例發生在執行時間

因此,本質上,C++並不是爲您設計的特定對象的方法!特里斯坦布林德爾的答案是一個非常好的方法,以防你想要做這樣的事情。在動態類型語言的「較低級別」中,類似的情況正在發生。例如,您可以使用功能圖,因此您可以撥打myInstance.callFuncion["myMethodX"]()。你找到了一種方法來「動態化」一個對象的方法數量...... :-)

相關問題