2010-07-01 18 views
0

在我的新項目中,我希望(主要是爲了看看它是如何工作的)徹底禁止我的代碼中的原始指針。使用繼承來計算任何類的引用嗎?

我的第一種方法是讓所有的類都是從這個簡單的類繼承: 模板 Base類 { 市民: 的typedef的std :: shared_ptr的PTR; };

簡單使用class :: ptr無論我需要一個指針。

這種方法似乎很合適,直到我有時意識到我的對象希望將'this'指針傳遞給其他對象。讓我的對象把它包裝在shared_ptr中是不會做的,因爲那樣可能有兩個所有者指向同一個指針。我認爲這是不好的。

我的下一個想法是改變'Base'類來實現引用計數本身,因此每個從'Base'繼承的類的實例只能有一個計數。

這是一個很好的解決方案,有沒有更好的,可以提高和/或STL已經解決了我的這個問題?

+1

爲什麼你想「完全禁止生魚指針」?你是否試圖避免做出關於對象所有權的設計決定? – 2010-07-01 09:27:00

+0

在某些情況下,是的,我的項目是一個遊戲,對象可能沒有明確的擁有者(即敵人會產生另一個敵人,然後死亡,但這也是一個很大的實驗,你可以採取多大的概念,然後還有懶惰的永遠不必考慮內存管理!) – monoceres 2010-07-01 09:31:53

+0

@Charles我認爲這是一個相當不錯的主意,如果我們稍微不同地改寫它,具有非常嚴格的RAII合規性。不過,我想重申一下,「完全禁止內存管理的原始指針。」要完全避免傳遞'原始'指針是非常困難的,但是可以通過一個堅定的策略並啓動一個新的代碼庫,使用scoped_ptr和scoped_array來構建所有的東西。那些已經形成RAII兼容的原語來將運算符new/new []的結果存儲在'原始'指針上。 – stinky472 2010-07-01 09:34:26

回答

1

你可能想看看enable_shared_from_this

另一方面,當使用shared_ptr時,您需要注意循環引用的可能性。爲避免這種情況,您可以使用weak_ptr。這意味着你需要一些方法來區分它們,所以簡單地使用typedef class::ptr可能是不夠的。

+0

正是我想要的!我已經有了一個感覺,已經有了答案。 我想weak_ptr的另一個typedef將解決這個問題。 – monoceres 2010-07-01 09:59:52