代码之家  ›  专栏  ›  技术社区  ›  ciyo

将唯一指针初始化为类成员

  •  2
  • ciyo  · 技术社区  · 6 年前

    我正在研究一个向量为 unique pointers 作为班级成员。在处理它的过程中,我意识到如果唯一指针将拥有的对象作为参数出现,我不确定如何将唯一指针初始化为类成员。

    所以,我只是在问:如果将拥有的对象作为参数出现,我应该如何将唯一指针初始化为类成员?

    我应该使用新的( addTheObject(new Object()) )然后使用 std::make_unique ? 是否应将对象作为unique\u ptr传递( addTheObject(std::unique_ptr<Object>& theObject) )和使用 std::move(theObject) ?

    正确的处理方法是什么?

    如果您需要更具体的示例:

    我有一个 DT_Node 类,它是树的一个节点,我将使用 DT\U节点 .

    DT\U节点 有一个名为 addChild() 用于将子节点插入其节点向量。

    DT\U节点 将在不同的cpp文件中用于构造树,这意味着另一个cpp文件将使用 addChild() 方法添加节点的子级。

    // DT_Node.hpp
    class DT_Node
    {
    public:
    
        DT_Node();
        virtual ~DT_Node();
    
        virtual void decide() = 0;
    
        virtual void addChild( ??? );
    
    private:
    
        std::vector< std::unique_ptr<DT_Node> > mNodes;
    };
    

    // DT_Node.cpp
    DT_Node::DT_Node()
    {
    
    }
    
    DT_Node::~DT_Node()
    {
        mNodes.clear();
    }
    
    void DT_Node::addChild( ??? )
    {
        ???
    }
    
    3 回复  |  直到 6 年前
        1
  •  8
  •   Martin Bonner supports Monica    6 年前

    您需要的是:

    void DT::Node::addChild(std::unique_ptr<DT_Node>&& child) {
        mNodes.emplace_back(std::move(child));
    }
    

    顺便说一下,你的标题有误导性。unique\u ptr不是一个成员(它包含在一个成员中),您也不能肯定地初始化一个成员(为此,您将在构造函数中使用成员初始值设定项列表语法)。

        2
  •  3
  •   BiagioF    6 年前

    std::unique_ptr 保留 拥有 指向的对象的。这意味着如果要将其作为参数传递,必须 移动 所有权。

    类似(注意 move && -参考号):

    void addChild(std::unique_ptr<Node>&& iNode) {
      mNodes.emplace_back(std::move(iNode));
    }
    

    最后,我强烈建议你看看 this Herb Sutter Video . 它为使用智能指针的数据结构提供了一些有用的建议。

        3
  •  0
  •   seccpur    6 年前

    假设DT\U节点不是纯虚拟基类,这是代码片段。您还需要一个复制构造函数。使用了两个版本的addChild,这是不言而喻的。

      class DT_Node
    {
    public:    
        DT_Node();
        DT_Node(const DT_Node& other); // copy constructor will be needed
        virtual void addChild(std::unique_ptr<DT_Node>&& node); // move from source
        virtual void addChild(const std::unique_ptr<DT_Node>& node);  //non destructible source
    
    private:    
        std::vector<std::unique_ptr<DT_Node> > mNodes;
    };    
    
    void DT_Node::addChild(std::unique_ptr<DT_Node>&& node) 
    {
        mNodes.push_back(std::move(node));
    }
    void DT_Node::addChild(const std::unique_ptr<DT_Node>& node)  
    {
    
        std::unique_ptr<DT_Node> new_node = std::make_unique<DT_Node>(*node);
        mNodes.push_back(std::move(new_node));
    }