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

问题描述 投票:1回答:3

我正在研究一个树形结构,它有一个unique pointers矢量作为类成员。在研究它时,我意识到如果唯一指针所拥有的对象作为参数,我不确定如何将唯一指针初始化为类成员。

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

我应该使用新的(addTheObject(new Object())),然后使用std::make_unique?我应该将对象作为unique_ptr(addTheObject(std::unique_ptr<Object>& theObject))传递并使用std::move(theObject)吗?

处理这个问题的正确方法是什么?

如果你需要更具体的例子:

我有一个DT_Node类,它是一个树的节点,我将使用DT_Node构建一个树。

DT_Node有一个名为addChild()的方法,用于将子节点插入其节点向量中。

DT_Node将在不同的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( ??? )
{
    ???
}
c++ smart-pointers unique-ptr
3个回答
8
投票

你需要的是:

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

顺便说一下,你的头衔是误导性的。 unique_ptr不是成员(它包含在成员中),并且您肯定不会初始化成员(您将在构造函数中使用成员初始化列表语法)。


3
投票

std::unique_ptr保留了尖头物体的自己。这意味着如果您想将其作为参数传递,则必须移动所有权。

像(注意move&&-reference):

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

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


0
投票

假设DT_Node不是纯虚基类,则这是代码片段。您还需要一个复制构造函数。使用了两个版本的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));
}
© www.soinside.com 2019 - 2024. All rights reserved.