如何在c类中存储智能指针列表?
我有一个类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.0)); edges.push_back(std::make_unique<Edge>(*nodes[0],*nodes[1],1.0)); nodes[1]->AddEdge(edges[0]); } 编译器给出错误
它曾经在Node的std :: vector< Edge *>中使用原始指针,因为AddEdge的签名将是无效的AddEdge(Edge& edge);,在向量内推回边缘. 我的代码出了什么问题?我该如何处理呢?鉴于std :: vector无法存储引用,因为它们不可分配. PS:我不想将指针的所有权转移给Node对象…… 解决方法
std :: vector :: push_back复制其参数,并且std :: unique_ptr无法复制,只能移动它.
你必须移动传递的std :: unique_ptr: void inline AddEdge(std::unique_ptr<Edge> edge) { this->inEdges.push_back(std::move(edge)); } 然后像这样调用它: nodes[1]->AddEdge(std::move(edges[0])); 此外,inEdges不必是std :: unique_ptr的向量,因为它们应该是非拥有的. std :: unique_ptr意味着所有权,但正如您所说,Node不拥有边缘. 使用std :: vector< Edge *>相反(或std :: observer_ptr,当它在不久的将来实现时),因为原始指针(通常)意味着非所有权.你必须要小心std :: vector< Edge *>的生命周期.不超过std :: unique_ptrs的生命周期,否则指针将悬空. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |