c – 从指针创建unique_ptr

以下代码给出了错误

void EntityContainer::AddChild(Entity* child) 
{ 
    unique_ptr<Entity> childPtr(child);
    children.push_back(childPtr);
}

我认为这可能不是为现有对象创建unique_ptr的正确方法.怎么能这样做呢?上面的代码给出了以下错误

1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(617): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

解决方法

您无法复制唯一指针.因为它们是……独特的.但是,您可以移动它们:

children.push_back(std::move(childPtr));

这有点多余,所以你可以说:

children.push_back(std::unique_ptr<Entity>(child));

然而,安置施工已经提供了容器元件的直接构造:

children.emplace_back(child);

然而,这些都没有达到标准.问题实际上是你有一个获取某些东西的功能,并且在界面中完全不可见.所以你应该更改函数签名并让调用者明确地给你所有权:

void EntityContainer::AddChild(std::unique_ptr<Entity> child) 
{ 
    children.push_back(std::move(child));
}

现在,如果用户获得所有权语义错误,则不再是您的错!

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...