2011-04-25 31 views
0

現在,在我的遊戲gui API中,例如,我有一個MouseListener。有關此設計的幫助

這只是一個帶方法的抽象類。現在,它的使用方式如下:

可以說,我想一個Widget接受鼠標監聽器:

我創建鼠標偵聽的載體,提供添加和刪除功能刪除監聽器。每當事件發生時,該Widget將調用所有鼠標偵聽器的方法(例如:鼠標向下)。

在事情的另一方面,您將有一個實現MouseListener方法的類。

我對這個系統唯一的問題是,如果Listener被破壞,它無法通知它正在監聽的所有東西。

所以我想要一個系統,如果任何一端被破壞,他們都會得到通知,並將對方彼此移除,就像他們從未被添加過一樣。

我也想這樣做,以便每個Listener(例如:MouseListener)都從Listener繼承,這樣任何想要創建更精細的Listener類的人都可以輕鬆使用此功能。

任何想法設計這樣的東西將不勝感激。 謝謝

一個設計是,非boost,非C++ 0x,非自動垃圾收集,非智能指針....只是普通的舊C++ 98標準解決方案。

+0

嗯夠公平的。我不喜歡所有這些新老化的花式提升垃圾收集等。但從我收集的閱讀遊戲編碼完成Origin系統公司的Mike和Ultima VII/VIII成名後,弱指針和強指針的概念就被人們用來實現自己。但是現在人們已經習慣了使用新的C++標準進行標準化,所以爲什麼不跟他們一起幹呢? – 2011-04-26 03:21:05

+0

滾動你自己也不算太困難,基本前提是每個指針實際上是兩個指針,一個指向內存中的一些對象,弱/強引用,另一個指向對象本身。當強參考計數器達到零時,該對象被銷燬,而當所有參考計數器達到零時參考計數器被銷燬。每次指針被銷燬時,它都會要求參考計數器減少其類型(弱/強)的計數。 這應該可以在C++ 98甚至C中實現。 – 2011-04-26 03:23:36

回答

2

聽者聽到的東西(從現在開始叫做發聲器)怎麼知道聽者?他們存儲一個指針嗎?

如果是這樣,我建議給發聲器一個弱指針給聽衆。一旦監聽器破壞,弱指針將不再有效,所以當vocalizer試圖通知監聽器時,它會看到並且可以從要通知的事情列表中刪除指針。

同樣可以通過其他方式完成(聽衆可以存儲指向發聲器的弱指針,儘管我不明白爲什麼你需要這個)。

您可以實現自己的強和弱的指針,也可以使用那些在的C++ 0x標準庫(可使用gcc和vC++ 10)

0

你會考慮使用現有的東西,如Boost Signals2Qt

+1

不,我不會。 – jmasterx 2011-04-25 13:53:09

+0

你爲什麼不呢? – 2011-04-25 15:03:20

+0

因爲我不希望我的遊戲的苗條圖書館依賴於這些大型圖書館。 – jmasterx 2011-04-25 15:27:41

0

可以使用boost::weak_ptr時的任何一方關聯可以被破壞。在你的情況下,一個widget將有一個weak_ptrs矢量,每個監聽器都將被創建爲一個boost :: shared_ptr。當迭代向量時,你將嘗試將weak_ptr作爲shared_ptr來鎖定,如果它沒有被銷燬,就使用它。從顯示轉換成的weak_ptr一個shared_ptr提升頁面示例如下

shared_ptr<int> p(new int(5)); 
weak_ptr<int> q(p); 

// some time later 

if(shared_ptr<int> r = q.lock()) 
{ 
    // use *r 
} 

這種設計可以幫助你打破一個容器,容易包含的元素的關聯,而無需通知機制,而是在容器迭代時間。

+0

儘管這很有趣,但我並不想要Boost解決方案。 – jmasterx 2011-04-25 15:24:25