2015-10-14 141 views
1

該錯誤似乎在函數insert和printTree中。我知道這個錯誤是由unique_ptr不可複製引起的。但我認爲提供移動和複製語義應該幫助我解決它。 我的問題使用已刪除的函數std :: unique_ptr

  1. 有我做的複製和移動構造函數是否正確?

  2. 如果否。我應該如何重新設計代碼。請列出基本錯誤以及如何糾正它們。

  3. 如何將Node *父級包含在類中?

  4. 在這種情況下,好的代碼實踐一些技巧將是有益的

    // 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 
    
+1

你真的不應該把舊的智能指針看作舊的「正常」方式中的指針,而應該考慮更多作爲資源所有權:資源一次只能擁有一個所有者('std :: unique_ptr')還是擁有許多同時擁有者('std :: shared_ptr')? –

+0

@JoachimPileborg。我知道unique_ptrs只有單一所有權。我的問題伴隨着我無法構建BinaryTree的移動和複製語義。 – AlexanderTG

+1

對不起,也許聽起來不禮貌,但「單一所有權」的哪部分使你認爲你可以*實現任何形式的複製?你不能複製'std :: unique_ptr'對象,你不能複製它內部的指針(然後你有兩個包含相同指針的'std :: unique_ptr'對象,同時會導致壞的事情),唯一的方法是實際創建全新的節點並僅複製該值。您可能需要重新考慮您的設計,或者至少需要實施您的設計。 –

回答

2
  1. 號無法複製獨一無二的指針。您必須決定樹的深層副本是否有意義。
  2. 使用移動構造函數並移動賦值運算符而不是複製構造函數和複製賦值運算符。
  3. 添加一個原始指針Node* parent。父母擁有自己的孩子,反之亦然。
  4. 使用std::make_unique()。避免包含你不需要的標題。 printTree()不適用於this嗎?通常,你可以稍微使用一種更易讀的語法(縮進,空行等)。
+0

編譯器給出的printTree函數中的錯誤指向printNode函數的初始化。錯誤指向'初始化參數1'void BinarySearchTree :: printNode(std :: unique_ptr :: Node>)[with ValueType = int]'| – AlexanderTG

相關問題