2016-05-14 19 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'自体にはコピーコンストラクタがありません。なぜなら、ユニークであると思われるもののコピーを複数持つことは意味がないからです。これにはmoveコンストラクタがあります。したがって、1つの '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); 

} 
関連する問題