【发布时间】:2016-08-11 19:52:08
【问题描述】:
我有一个类Node,它必须有一个其输入Edge 的列表。然而,这些输入Edge 并不意味着被Node 修改,只能被访问。有人建议我为此使用智能指针,如下所示:
class Node
{
private:
std::vector<std::unique_ptr<Edge>> inEdges;
//...
public:
void inline AddEdge(std::unique_ptr<Edge>& edge) // could be const here too
{
this->inEdges.push_back(edge);
}
//...
}
所以在运行时我可以创建一个节点和边的列表并将边分配给每个节点:
int main()
{
std::vector<std::unique_ptr<Nodes>> nodes;
std::vector<std::unique_ptr<Edges>> edges;
nodes.push_back(std::make_unique<Node>(0, 0.5, 0.0));
nodes.push_back(std::make_unique<Node>(1, 0.5, 0.0));
edges.push_back(std::make_unique<Edge>(*nodes[0], *nodes[1], 1.0));
nodes[1]->AddEdge(edges[0]);
}
编译器报错
错误 1 错误 C2280: 'std::unique_ptr>::unique_ptr(const std::unique_ptr<_ty>> &)' : 试图引用已删除的函数 c:\program files ( x86)\microsoft visual studio 12.0\vc\include\xmemory0 593 1 先生
它曾经使用Node 的std::vector<Edge*> 内的原始指针,因为AddEdge 的签名将是void AddEdge(Edge& edge);,推回向量内的&edge。
我的代码有什么问题?我应该如何着手纠正它?鉴于 std::vector 不能存储引用,因为这些是不可分配的。
PS:我不想将指针的所有权转移到Node 对象...
【问题讨论】:
-
std::unique_ptr可以移动,但不能复制。您的AddEdge应该按值接受它,并使用std::move进一步传递它 -
Node是否拥有边缘?如果不是,请使用原始指针(或std::reference_wrapper)。如果是:用普通的std::vector<Edge>代替有什么问题? -
但我不想转让指针的所有权
-
Edge有自己的动态...每个Node只能获得每个Edge的输出信号...所以Node不拥有@ 987654344@的 -
@Girardi “应该是
std::shared_ptr吗?” 不,智能指针意味着所有权。只是观察而不拥有使用原始指针和引用。使用后者(如果指针不能为 0,则可能通过std::reference_wrapper。
标签: c++ c++11 pointers smart-pointers