将unique_ptr分配给原始指针

时间:2018-10-20 15:41:17

标签: c++ unique-ptr

我正在尝试使用唯一指针将一个节点链接到另一个节点。我设法用下面的代码来完成它,但是感觉很糟糕,因为它缠绕了这么长时间。我该如何改善呢?

3s

2 个答案:

答案 0 :(得分:0)

也许使用右值引用并进行移动交换:

#include <memory>
#include <iostream>

using namespace std;

template<typename T>
class Node {


public:
    T data;
    unique_ptr<Node<T>> nextNode;

    Node(T dataIn) : data(dataIn), nextNode(nullptr) {

    }

    void setNextNode(std::unique_ptr<Node<T>> &&nodeIn) {
            std::swap(nextNode, nodeIn);
    }

    void printData() {
      cout << data << endl;
    }



};




int main() {
  unique_ptr<Node<int>> root(new Node<int>(26));
  root->setNextNode(std::make_unique<Node<int>>(88));
  root->nextNode->printData();

}

简短的评论是,您不应将其他地方的unique_ptrs作为整体显示其所有权,因此可以说是更改setNextNode:

void setNextNode(T &&nodeValue) {
        nextNode = std::make_unique<Node<T>>(nodeValue);
}

并添加如下内容:

root->setNextNode(88);

make_unique也是c ++ 14的一部分,如果您使用的是c ++ 11,请使用reset:

nextNode.reset(new Node<T>(nodeValue));

答案 1 :(得分:0)

这不是使用unique_ptr的推荐方法:您可以使用new来自动将对象包装在唯一的指针内,而不用std::make_unique创建对象。 / p>

您还会混合使用原始指针和唯一指针,这很不好,因为它可能导致混淆谁是传递对象的所有者。下面是一个更好的列表示例:

#include <memory>
#include <iostream>

template<typename T>
class Node {
public:
    T data;
    std::unique_ptr<Node<T>> nextNode = nullptr;

    Node(T dataIn) : data(dataIn) {

    }

    void setNextNode(std::unique_ptr<Node<T>>&& nodeIn) {
      std::swap(nextNode, nodeIn);
    }

    void printData() {
      std::cout << data << std::endl;
    }
};




int main() {
  auto root = std::make_unique<Node<int>>(26);
  auto nodeTwo = std::make_unique<Node<int>>(88);
  root->setNextNode(std::move(nodeTwo));

}

请注意使用std::movestd::swap来正确转移所有权。