2012-12-13 58 views
1

我正在用OpenGL編寫一個程序,並且會發生將要發生的自定義事件,例如。當一名球員遇到障礙或邁出一步。我想要做的是:這是一個很好的設計選擇?

有一個名爲類似「EventBroadcaster」的單例類。該廣播公司將從節目周圍獲得美聯儲活動。然後,當它接收到一個事件時,它會將它發送給所有監聽器(「EventListener」對象),並帶有一個void *,其中包含一個保存事件信息的結構體。 EventListener對象可以使用自己的自定義回調函數來處理不同類型的事件。現在,我想避免使用void *,如果一切可能,所以...

...問題是,我怎樣才能做到這一點與模板接口?

+4

你爲什麼不能繼承從一個單一的接口的所有活動? – imreal

+1

您可能想看看觀察者設計模式(http://sourcemaking.com/design_patterns/observer) – Carl

回答

1

鑄造一切爲void *,然後再是容易出錯。看看boost::signals或一些other信號/插槽庫。它可以幫助您避免丟棄類型信息。

一個類可以公開一個插槽然後調用它。例如,可能有像void PlayerMovedTo(Point position)這樣的插槽。其他類可以連接到該插槽,並在信號發送時通知。

這裏的信號/槽機制一般是如何工作的草圖:

class Game { 
public: 
    Signal<void (float, float)> PlayerMovedTo; 

    void update() { 
    if (downKeyPressed) { 
     y += 10; 
     PlayerMovedTo(x, y); // Tell everyone about it 
    } 
    } 
}; 


class Mine { 
public: 
    Mine() { 
    // There can be many mines, all connected to the one signal. 
    game.PlayerMovedTo.connect(this, &Mine::playerMoved); 
    } 

    void playerMoved(float x, float y) { 
    if (distance(this->x, this->y, x, y) < 10) { 
     boom(); 
    } 
    } 
}; 
+0

這是一個乾淨的模板化解決方案。 – Shokwav

2

如果你想要做的是避免因爲您使用的是空指針被丟棄類型的信息,你可能想看看boost::any

相關問題