2013-01-24 71 views
4

這是我第一次體驗智能指針在c + +中,我有一些理解問題。 我想設計一些基於組件的OpenGL框架。加速智能指針設計問題

所以我有一個Scene類創建節點(並存儲自己)並將其作爲shared_ptr返回。 節點類有一個在Node類中創建的組件列表,並且作爲shared_ptr再次返回,但這些組件還需要對其所有者(節點)的引用,並且節點本身應將其指針傳遞給其組件。

現在:指向組件中的節點的指針,它應該是什麼?一個shared_ptr或一個weak_ptr。以及如何通過節點本身的節點(節點沒有引用其存儲在場景中的shared_ptr)

//!編輯1

class Scene 
{ 
vector<shared_ptr<Node>> nodes; 
public: 
weak_ptr<Node> NewNode(); 
} 

class Node 
{ 
vector<shared_ptr<Component>> components; 
public: 
weak_ptr<Component> AddComponent(); 
weak_ptr<Component> GetComponent(String classname); 
vecotr<weak_ptr<Component>> GetComponents(String classname); 
} 

class Component 
{ 
weak_ptr<Node> owner; 
Component(weak_ptr<Node> owner_refernce); 
public: 
// component stuff 
weak_ptr<Node> GetOwner(); 
friend class Node; 
} 

請幫我在這裏做最好的設計。

//編輯1:要更清楚!

場景是節點的唯一擁有者。它創造並摧毀它們。 每個節點擁有其所有組件。它創造並摧毀它們。 而組件需要對其所有者的引用,它們將與其他對象共享(通過在Get方法中返回所有者)。

- >場景擁有節點和節點自己的組件。

- >場景股節點(通過名稱返回節點對象)

- >節點共享其所有組件(通過類名返回成分)

- >部件分享他們的所有者(返程所有者參考)

如何共享對象而不共享所有權? weak_ptr ??

編輯2:看來智能指針在這種情況下是沒有用的。所以我用行指針去爲現在

+1

無論如何避免通過'shared_ptr'進行循環引用!恕我直言,'Component'中的'owner'應該是'weak_ptr'。 –

回答

3

從你的描述,這聽起來像Node實例具有 明確所有者(Scene)。如果是這樣,shared_ptr不一定是 的最佳解決方案; std::unique_ptr,甚至原始指針( 必須刪除~Scene)可能更適合 。或者也許是Boost的指針矢量。同樣的 注意事項適用於ComponentNode。並且Component中的父指針 看起來像嚴格用於 導航,所以原始指針將是最合適的。

+1

不會使用行指針,打敗使用智能指針的目的? – Penman

+1

@peyman如果使用智能指針的目的只是使用智能指針,是的。否則,我不明白這個問題。使用智能指針的目的是或應該解決特定的問題。如果問題不存在,則沒有理由使用智能指針。當指針用於導航時,問題不存在(或者如果它存在,通常的智能指針不能解決它,所以你需要別的東西)。 –