2016-05-14 4 views
-3

Как реализовать конструктор SearchTree с параметром типа T, вызвав его суперкласс?Как вызвать базовый конструктор, если ваш класс получен из unique_ptr

template <class T> 
class SearchTree: protected unique_ptr<Node<T> >{ 
    public: 
     SearchTree<T>(); 
     SearchTree<T>(const T &); //How do I implement this ? 
} 

template <class T> 
class Node{ 
    friend class SearchTree<T>;  
    public: 
     Node<T>(); 
     Node<T>(const T & sl_):sl(sl_){}; 
    private: 
     const T sl; 
     SearchTree<T> left,right;  
} 
+10

не вытекает из std :: unique_ptr. Таким образом безумие. инкапсулировать его. –

+0

Это школьное упражнение, этот код дается. Мне нужно реализовать конструктор ... – Agnaroc

+3

Вы не можете просто написать конструктор копирования; вы должны знать, что такое правильная семантика. 'unique_ptr' сам не имеет конструктора копирования, потому что нет смысла иметь несколько копий того, что должно быть уникальным. Он имеет конструктор перемещения, так что только один объект 'unique_ptr' содержит указатель на управляемый ресурс. Итак, первое, что вам нужно сделать, это ответить на пороговый вопрос: что значит копировать объект «SearchTree»? –

ответ

1

Наследование std::unique_ptr является мгновенным индикатором ошибки проектирования.

Инкапсуляция - это путь. Возможно, начните с чего-то подобного?

#include <memory> 

template<class T> struct Node; 

template<class T> 
void add_node(std::unique_ptr<Node<T>>& next, T t); 

template<class T> 
    struct Node 
    { 
    Node(T t) : _value(std::move(t)) {} 
    void add(T t) 
    { 
     if (t < _value) { 
     add_node(_left, std::move(t)); 
     } 
     else if(t > _value) { 
     add_node(_right, std::move(t)); 
     } 
     else { 
     // what? 
     } 
    } 


    T _value; 
    std::unique_ptr<Node<T>> _left, _right; 
    }; 

template<class T> 
    void add_node(std::unique_ptr<Node<T>>& next, T t) 
    { 
     if (next) { 
     next->add(std::move(t)); 
     } 
     else { 
     next = std::make_unique<Node<T>>(std::move(t)); 
     } 
    } 


template<class T> 
    struct SearchTree 
    { 

    void add(T t) { 
     add_node(_root, std::move(t)); 
    } 

    std::unique_ptr<Node<T>> _root; 
    }; 

int main() 
{ 
    SearchTree<int> tree; 
    tree.add(5); 
    tree.add(3); 
    tree.add(4); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^