2012-05-06 1 views
0

ちょっと変わったところ、私は自分のテンプレートリンクリストを教育的な運動として成功裏に実装しました。今私はそれが動作することを知っている、私は "スプライト"オブジェクトを保持するノードのリストを作成するために使用していたと私はそれを理解したが、私は行って、今日それを振り返って、私は本当に混乱している。私のテンプレート付きリンクリストについて

私の実装を見て、理解するのに十分親切な人は、

どのようにして_data(Node内)にNodeTypeのオブジェクトを割り当てるべきかを知ることができますか? (あなたが悪い言い訳を許そうとするならば)私はその機能がSetDataであることを意味しますが、私は決してそれを使用しません。たとえば、リストをプッシュバックすると、ListTypeの新しいノードが作成されますが、そのノードのデータは決して設定されません。ノードコンストラクタには_data = new NodeTypeなどはありません。

さらに、私のリストの任意のノードでGetData()と呼んで、Spriteオブジェクトを戻すことができます。私はそれが動作することを知っていることを意味しますが、私はどのように忘れてしまった!誰かが見て、私に思い出させることができますか?大いに感謝しています!

Node.hpp:

#if !defined NODE_HPP 
#define NODE_HPP 


template<typename NodeType> 
class Node{ 

    public: 
     Node(Node* prev = 0, Node* next = 0); 
     void SetData(NodeType newData); 
     NodeType* GetData(); 
     Node* GetPrev(); 
     Node* GetNext(); 

    private: 
     template<typename ListType> 
     friend class List; 

     NodeType _data; 
     Node* _prev; 
     Node* _next; 

}; 


///implement Node 

template <typename NodeType> 
Node<NodeType>::Node(Node* prev, Node* next) : _prev(prev), _next(next) 
{} 
template <typename NodeType> 
void Node<NodeType>::SetData(NodeType newData) 
{ 
    _data = newData; 
} 
template <typename NodeType> 
NodeType* Node<NodeType>::GetData() 
{ 
    return &_data; 
} 
template <typename NodeType> 
Node<NodeType>* Node<NodeType>::GetPrev() 
{ 
    return _prev; 
} 
template <typename NodeType> 
Node<NodeType>* Node<NodeType>::GetNext() 
{ 
    return _next; 
} 
#endif //define 

List.hpp

#if !defined LIST_HPP 
#define LIST_HPP 

#include "Node.hpp" 

///since we're creating a template everything must be defined in the hpp 

template <typename ListType> 
class List 
{ 
    public: 
     List(); 
     bool Empty(); 
     void PushFront(); 
     void PushBack(); 
     void PopBack(); 
     void ClearList(); 
     Node<ListType>* GetHead(); 
     Node<ListType>* GetTail(); 
     int NumberOfNodes(); 

    private: 
     Node<ListType>* _head; 
     Node<ListType>* _tail; 
     int _size; 

}; 


///implement List class here 
template <typename ListType> 
List<ListType>::List() : _head(0), _tail(0), _size(0) 
{ 
} 
template <typename ListType> 
bool List<ListType>::Empty() 
{ 
    return _size == 0; 
} 
template <typename ListType> 
void List<ListType>::PushFront() 
{ 
    _head = new Node<ListType>(_head , 0); 
    if(Empty()) //this is the start of a new list, need to set _tail as well 
     _tail = _head; 
    else 
     _head->_prev->_next = _head; //set previous nodes _next to new _head 


    ++_size; 
} 
template <typename ListType> 
void List<ListType>::PushBack() 
{ 
    _tail = new Node<ListType>(0 , _tail); 
    if(Empty()) //this is the start of a new list, need to set _head as well 
     _head = _tail; 
    else 
     _tail->_next->_prev = _tail; // set old tails _prev to new tail 

    ++_size; 
} 
template <typename ListType> 
void List<ListType>::PopBack() 
{ 
    if(!Empty()){ 
     if(_tail != _head) 
     { 
     _tail = _tail->_next; 
     delete _tail->_prev; //delete memory at old tail 
     _tail->_prev = 0; //reassign new tails _prev pointer to null 
     } 
     else // We are deleting the last node so treatment is a little different. 
     { 
     delete _tail; 
     _tail = 0; _head = 0; 
     } 

     --_size; 
    } 
} 
template <typename ListType> 
void List<ListType>::ClearList() 
{ 
    while(!Empty()) 
     PopBack(); 


} 

template <typename ListType> 
Node<ListType>* List<ListType>::GetHead() 
{ 
    return _head; 
} 
template <typename ListType> 
Node<ListType>* List<ListType>::GetTail() 
{ 
    return _tail; 
} 
template <typename ListType> 
int List<ListType>::NumberOfNodes() 
{ 
    return _size; 
} 
#endif //define 

答えて

1

コンストラクタを明示的に_dataについて何もしないので、それはデフォルトでは、*それを初期化します。つまり、建設後、_dataがデフォルトのNodeTypeに設定されています。 NodeTypeはデフォルトで構成可能ではなく、テンプレートの特殊化はコンパイルされませんでした。プログラムはこの初期化を行うことを "知っている"ことに注意してください。なぜなら、あなたのコンパイラがC++標準に定められた規則に従っているからです。

型を知っているとして、コンパイラ本質的には、このタイプのテンプレートをインスタンス化するNodeTypeを置き換え、この置換を使用して新しい型を作成します。従ってNode<std::string> would result in a type where_data is of type std :: string`。

  • NodeTypeがpromitiveタイプであれば、その後、そこにはinitialzationないだろう、と_dataは古いゴミ値を保持します。
+0

とどのように_データが型を知っていますか? –

+0

ああ、私はしばらくかかってくれてありがとうが、私は今あなたと一緒にいます!データを指すための乾杯はNodeTypeのものなので、初期化されていなければNodeTypeのデフォルトコンストラクタになります! – Holly

関連する問題