2014-07-03 32 views
1

我很難理解獨特指針的所有權。 任何人都可以解釋如何將指針存儲到集合中的唯一指針嗎?獨特的指針所有權

typedef std::pair<SceneNode*, SceneNode*> Pair; 

typedef std::unique_ptr<SceneNode> Ptr; 

std::vector<Ptr> mChildren; 

void SceneNode::checkSceneCollision(SceneNode& sceneGraph, std::set<Pair>& collisionPairs) 
{ 
    checkNodeCollision(sceneGraph, collisionPairs); 

    for(Ptr& child : sceneGraph.mChildren) 
     checkSceneCollision(*child, collisionPairs); 
} 

void SceneNode::checkNodeCollision(SceneNode& node, std::set<Pair>& collisionPairs) 
{ 
    if (this != &node && collision(*this, node)) 
     collisionPairs.insert(std::minmax(this, &node)); 

    for(Ptr& child : mChildren) 
     child->checkNodeCollision(node, collisionPairs); 
} 

這難道不是違抗的unique_ptr的含義是:從中說明了這個問題SFML遊戲開發本書

實例?因爲可以從集合中訪問實際的對象並對其進行修改。

+1

@Cyber​​我想你在考慮'shared_ptr'? –

+0

這是可以的,但是它取決於你確保你不通過常規指針訪問對象,在被unique_ptr刪除之後 –

回答

2

難道這不違背unique_ptr的含義嗎?

unique_ptr號,如你所說,指定所有權語義 - 而不是其他。具體來說,它指定指針只有一個所有者,但它沒有說任何有關訪問的內容。可以有任意數量的訪問器。

0

唯一的ptr只能通過引用訪問。因此,在這兩種情況下的所有者永遠不會改變容器是ptr的所有者。

for(Ptr& child : mChildren) 
     child->checkNodeCollision(node, collisionPairs); 

在這種情況下對於每個包含指針的引用創建參考從未調用移動或複製語義爲此不參與所有權。