ちょっと変わったところ、私は自分のテンプレートリンクリストを教育的な運動として成功裏に実装しました。今私はそれが動作することを知っている、私は "スプライト"オブジェクトを保持するノードのリストを作成するために使用していたと私はそれを理解したが、私は行って、今日それを振り返って、私は本当に混乱している。私のテンプレート付きリンクリストについて
私の実装を見て、理解するのに十分親切な人は、
どのようにして_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
とどのように_データが型を知っていますか? –
ああ、私はしばらくかかってくれてありがとうが、私は今あなたと一緒にいます!データを指すための乾杯はNodeTypeのものなので、初期化されていなければNodeTypeのデフォルトコンストラクタになります! – Holly