該錯誤似乎在函數insert和printTree中。我知道這個錯誤是由unique_ptr不可複製引起的。但我認爲提供移動和複製語義應該幫助我解決它。 我的問題使用已刪除的函數std :: unique_ptr
有我做的複製和移動構造函數是否正確?
如果否。我應該如何重新設計代碼。請列出基本錯誤以及如何糾正它們。
如何將Node *父級包含在類中?
在這種情況下,好的代碼實踐一些技巧將是有益的
// This is implementation of binary search tree. #ifndef BinarySearchTree_H #define BinarySearchTree_H #include <cstdio> #include <functional> #include <utility> #include <vector> #include <iostream> #include <memory> //template declaration template <class ValueType> class BinarySearchTree { struct Node { ValueType value; std::unique_ptr<Node> left; std::unique_ptr<Node> right; //Node *parent=nullptr; // How can I use parent in the class ? Node(){} //Node(const ValueType& value,std::unique_ptr<Node> left,std::unique_ptr<Node> right):value(value),left(left),right(right){} Node (const ValueType& value):value(value),left(nullptr),right(nullptr){} }; std::unique_ptr<Node> root; void insert(const ValueType& value, std::unique_ptr<Node> node) { if(value< node->value) { if(node->left) { insert(value,node->left); } else { std::unique_ptr<Node> left=std::unique_ptr<Node>(new Node(value)); node->left=left; } } else { if(node->right) { insert(value,node->right); } else { std::unique_ptr<Node> right=std::unique_ptr<Node>(new Node(value)); node->right=right; //right->parent=node; } } } void printNode(std::unique_ptr<Node> node) { if(!node) { std::cout<<"No element in the tree\n"; } else { if(node->left) { std::cout<<node->left->value<<" "; } std::cout<<node->value<<" "; if(node->right) { std::cout<<node->right->value<<" "; } } } public: BinarySearchTree():root(nullptr){} ~BinarySearchTree(){} BinarySearchTree(BinarySearchTree && rhs):root(std::move(rhs.root)){} BinarySearchTree& operator=(BinarySearchTree && rhs) { root=std::move(rhs.root); return *this; } BinarySearchTree& operator=(const BinarySearchTree & rhs) { if(this!=&rhs) root.reset(rhs.root); return *this; } void insert(const ValueType& value) { if(root==nullptr) { root=std::unique_ptr<Node>(new Node(value)); } else { insert(value,root); } } // void remove(const ValueTypr& value); void printTree(const BinarySearchTree& tree) { if(tree.root) { if(tree.root->left) { printNode(tree.root->left); } printNode(tree.root); if(tree.root->right) { printNode(tree.root->right); } } else { std::cout<<"tree is empty\n"; return; } } }; #endif // BinarySearchTree
你真的不應該把舊的智能指針看作舊的「正常」方式中的指針,而應該考慮更多作爲資源所有權:資源一次只能擁有一個所有者('std :: unique_ptr')還是擁有許多同時擁有者('std :: shared_ptr')? –
@JoachimPileborg。我知道unique_ptrs只有單一所有權。我的問題伴隨着我無法構建BinaryTree的移動和複製語義。 – AlexanderTG
對不起,也許聽起來不禮貌,但「單一所有權」的哪部分使你認爲你可以*實現任何形式的複製?你不能複製'std :: unique_ptr'對象,你不能複製它內部的指針(然後你有兩個包含相同指針的'std :: unique_ptr'對象,同時會導致壞的事情),唯一的方法是實際創建全新的節點並僅複製該值。您可能需要重新考慮您的設計,或者至少需要實施您的設計。 –