2013-01-08 70 views
2

我有一個有向無環圖,由節點對象組成。每個節點都有一個std::shared_ptr的清單給其他節點,它們是圖中的子節點。我需要很多有用的方法,比如插入/放置/重新設置節點,測試節點是否是另一個節點的祖先等等。有些是標準的STL類方法,有些是針對有向無環圖而特定於我的需要。C++設計:通過指針/引用ref-counting對象

問題是,當這種方法將節點作爲參數時,是否需要引用?的weak_ptr?或shared_ptr?我試圖檢查用例,但很難說清楚。這裏最好的設計是什麼?我是新來的智能指針,我不確定什麼是最好的選擇。我應該將shared_ptr<Node>作爲節點對象的「表示形式」嗎?或者,也許選擇的方式更復雜?

預先感謝

回答

2

只有傳遞shared_ptr(由值)或複製它當設置所有者的是有意義延長。當處理節點爲純信息時,安全並且首選的是傳遞指針。

請注意std::enable_shared_from_this設施從任何圖形對象檢索正確的std::shared_ptr。使用該基類,一個有效的裸指針和一個共享指針基本上是等價的。我不確定它增加了多少,如果有的話。 (它絕對確保不會有額外的堆碎片,這也是std::make_shared也是。)

通過shared_ptr任何地方只是shared_from_this優雅地提供的功能的優化。但是當你這樣做時,通過const參考傳遞它們,因爲它們只是提供信息而不主動仲裁所有權。

+0

我看到......我沒有意識到弱ptrs沒有operator->,所以傳遞它們是沒用的,因爲在大多數方法中,在做任何事情之前,我必須轉換爲共享ptr – cfa45ca55111016ee9269f0a52e771