2012-06-01 100 views
2

我有一個小的層次結構的類,我試圖找出維護所有權的簡單方法。由於這些對象駐留在堆上,並且由於我討厭原始指針,我想我會使用boost共享指針和弱指針。 (我可以選擇,但這是我習慣的。)共享指針可以幫助所有權,因爲當共享指針的所有者這麼說的時候,弱指針不會阻止對象被刪除。對象添加和從列表中刪除自己

層次結構:

class Actor; 
class Body : public virtual Actor; 
class Owned : public virtual Actor; 
class Combatant : public Body, public Owned; 

這裏也有一些其他類那裏。我可以使用虛擬繼承來處理鑽石繼承,所以這沒什麼大不了的。另外,我將爲它們中的每一個鍵入一些shared_ptrs和weak_ptrs。

我的想法是讓Actor維護Actor共享指針(ActorPTR)的靜態列表,並讓子類保持弱指針的靜態列表(BodyWPTR等)。這樣就有一個確定的共享指針集合,所以應該管理某種所有權(我會盡量不要在其他任何地方永久存儲共享指針)。擁有這些列表非常方便,因爲我可以快速地說,「讓我所有的戰鬥員都在附近」或「移動所有的身體」。

我想將對象插入到正確的列表中:一個Body將自己的弱指針插入到主體弱指針列表中,並且它會將一個Actor共享指針插入到該列表中,可能在構造函數。但(顯然)在構造函數中使用「this」指針(或它的shared_from_this()等價物)是很糟糕的。我能想到的唯一方法就是通過一大堆工廠方法。我還認爲,層次結構中的多個類繼承自enable_shared_from_this是很糟糕的。

如何讓對象在其構造函數中自動插入共享或弱指針到列表中?這是一個壞主意嗎?

(另外在「代碼」上面,我可能搞砸虛擬繼承語法但是這不是我關心的,現在,所以不要擔心。)

謝謝!

+1

沒有談到清理策略,你不能說內存管理策略。事實上,Actor的靜態列表將保持所有演員永遠活着(類似於內存泄漏)。一旦你公開了處理清理的策略,那麼我們可以適當地回答(請回復我的意見,然後通知我)。 –

+0

當然。Actor可能會有某種類型的destroy()方法將從列表中刪除。這樣,演員可以在需要時自行清理。如果它是唯一的永久共享指針,它應該被刪除,並且當遍歷弱指針列表時,我可以刪除那些過期的。 – whiterook6

+0

這很奇怪,但爲什麼不。爲了提高效率,Actor應該將一個迭代器放入列表中(它已經被插入),這樣destroy就是O(1)。你仍然有可能忘記調用'destroy()'並導致內存泄漏。 –

回答

1

您可以使用使用模板只是一個工廠方法:

template <typename T> 
T *myNew() { 
    T *t = new T(); 
    t->push_to_list(); 
    return t; 
} 

然後調用它像這樣:

MyClass *c = myNew<MyClass>(); 
1

我不明白爲什麼你弱指針困擾。

我認爲你的問題不是你問的具體問題,而是你的設計。基本上,你使用全局變量,這通常是一個糟糕的想法。真的,你可能應該有某種形式的對象,其中World擁有的東西是世界上所有演員的集合,所有主體的列表等等。

因此,您的典型構造是,例如創建一個新的Combatant並將其填充到世界中。或者,也許你的世界有一個spawnCombatant

+0

如果我使用一個世界對象,我需要一個單例或者一些靜態方法,這樣每個人都可以訪問它(它會有其他方法需要訪問的getCombatants()方法)。無論哪種方式,我認爲這仍然是全球價值。 – whiterook6