使用已删除的函数std :: unique_ptr

时间:2015-10-14 07:48:04

标签: c++ c++11 move copy-constructor

错误似乎在函数insert和printTree中。我知道这个错误是由unique_ptr不可复制引起的。但我认为提供移动和复制语义应该可以帮助我解决它。    我的问题

  1. 我是否制作了副本并正确移动构造函数?

  2. 如果没有。我该如何重新设计代码。请列出基本错误以及如何纠正错误。

  3. 如何在课程中加入Node * parent?

  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 个答案:

答案 0 :(得分:2)

  1. 否。您无法复制唯一指针。您必须决定树的深层副本是否有意义。
  2. 使用移动构造函数和移动赋值运算符,而不是复制构造函数和复制赋值运算符。
  3. 添加原始指针Node* parent。父母拥有子女,反之亦然。
  4. 使用std::make_unique()。避免包括您不需要的标题。 printTree()this无效的原因是否有原因?通常,您可以使用稍微更易读的语法(缩进,空行等)