2008-09-16 73 views
8

是否可以在C++中創建自定義事件?例如,假設我有變量X和變量Y.每當X改變時,我想執行一個函數來設置Y等於3X。有沒有辦法創建這樣的觸發器/事件? (觸發器在一些數據庫中很常見)C++中的自定義事件?

回答

0

據我所知,你不能使用默認的變量做到這一點,但是如果你寫到了一個回調函數的類你可以讓其他類註冊他們想要通知任何更改。

10

這基本上是Observer模式的一個實例(正如其他人提到並鏈接的那樣)。但是,您可以使用模板魔法來使它更具語法調整。考慮像...

template <typename T> 
class Observable 
{ 
    T underlying; 

public: 
    Observable<T>& operator=(const T &rhs) { 
    underlying = rhs; 
    fireObservers(); 

    return *this; 
    } 
    operator T() { return underlying; } 

    void addObserver(ObsType obs) { ... } 
    void fireObservers() { /* Pass every event handler a const & to this instance /* } 
}; 

然後,你可以寫......

Observable<int> x; 
x.registerObserver(...); 

x = 5; 
int y = x; 

你用什麼方法來寫你的觀察者回調函數是完全取決於你;我建議http://www.boost.org的功能或功能模塊(你也可以使用簡單的函子)。我也提醒你注意這種操作符重載。雖然它可以使某些編碼風格更清晰,魯莽使用渲染類似於

flyLikeAnIntToMe = 10;

a 昂貴的操作,可能會爆炸,並導致未來幾年的調試噩夢。

+0

很好的解釋!我在過去的項目中使用了助推器,並一直對結果感到滿意。 – 2008-09-16 23:57:05

3

Boost signals是另一個您可能會遇到的觀察者模式(aka Publish-Subscribe)常用庫。買家要小心這裏,我聽說它的表現太糟糕了。