我正在研究一个树形结构,它有一个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( ??? )
{
???
}
你需要的是:
void DT::Node::addChild(std::unique_ptr<DT_Node>&& child) {
mNodes.emplace_back(std::move(child));
}
顺便说一下,你的头衔是误导性的。 unique_ptr不是成员(它包含在成员中),并且您肯定不会初始化成员(您将在构造函数中使用成员初始化列表语法)。
std::unique_ptr
保留了尖头物体的自己。这意味着如果您想将其作为参数传递,则必须移动所有权。
像(注意move
和&&
-reference):
void addChild(std::unique_ptr<Node>&& iNode) {
mNodes.emplace_back(std::move(iNode));
}
最后,我强烈建议你看看this Herb Sutter Video。它通过智能指针为数据结构提供了一些有用的建议。
假设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));
}