加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在c类中存储智能指针列表?

发布时间:2020-12-16 10:13:16 所属栏目:百科 来源:网络整理
导读:我有一个类Node,必须有一个输入Edge的列表.但是,这些输入Edge不应由Node修改,只能被访问.我被建议使用智能指针,如下所示: class Node{private: std::vectorstd::unique_ptrEdge inEdges;//...public: void inline AddEdge(std::unique_ptrEdge edge) // cou
我有一个类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]);
}

编译器给出错误

Error 1 error C2280: ‘std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)’ : attempting to reference a deleted function c:program files (x86)microsoft visual studio 12.0vcincludexmemory0 593 1 sirs

它曾经在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的生命周期,否则指针将悬空.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读