2014-07-03 31 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); 

在这种情况下对于每个包含指针的引用创建参考从未调用移动或复制语义为此不参与所有权。