我正在尝试使用唯一指针将一个节点链接到另一个节点。我设法用下面的代码来完成它,但是感觉很糟糕,因为它缠绕了这么长时间。我该如何改善呢?
3s
答案 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::move
和std::swap
来正确转移所有权。