スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【コード】template を用いたリストクラス

長かった・・・
二週間くらい試行錯誤してたと思われる。

まずノードクラス。

template<typename T>class CNODE
{
private:
T *m_pPrev, *m_pNext;

public:
CNODE():m_pPrev(NULL), m_pNext(NULL){};

void SetPrev(T *Prev) { m_pPrev = Prev; } // 前の要素に値をセットする
void SetNext(T *Next) { m_pNext = Next; } // 次の要素に値をセットする

T* GetPrev()const { return m_pPrev; } // 前の要素へのポインタを取得
T* GetNext()const { return m_pNext; } // 次の要素へのポインタを取得
};


ノードクラスに前後を繋ぐ関数、SetPrev, SetNext を持たせました。
また、前後へのポインタを取得する関数、GetPrev, GetNext も付けときました。



次はリストクラス。

template<typename T>class CLIST
{
private:
T *m_pTop, *m_pEnd; // 先頭へのポインタ, 末尾へのポインタ
int m_NodeNum; // 要素の数

public:
CLIST():m_pTop(NULL), m_pEnd(NULL), m_NodeNum(0){}
~CLIST(){ }

//***************************************
// 指定したノードを末尾に繋げる
// 第一引数 : 追加するノード
// 戻り値 : なし
//***************************************

void PushBack(T *pAddNode)
{
if(!m_pTop) { m_pTop = pAddNode; }
if(m_pEnd) { m_pEnd->SetNext(pAddNode); }

pAddNode->SetPrev(m_pEnd);
pAddNode->SetNext(NULL);
m_pEnd = pAddNode;

++m_NodeNum;
}

//***************************************
// リストを空にする
// 引数 : なし
// 戻り値 : なし
//***************************************

void Clear()
{
T *wpNextNode = m_pTop;
T *DelNode;

while(wpNextNode)
{
DelNode = wpNextNode;
wpNextNode = DelNode->GetNext();
//SAFE_DELETE(DelNode);
}
m_NodeNum = 0;
m_pTop = m_pEnd = NULL;
}


//***************************************
// 指定したノードを削除する
// 第一引数 : 削除対象のノード
// 戻り値 : 第一引数の次のノードへのポインタ
//***************************************

T* DelNode(T *DelNode)
{
T *wpNextNode = DelNode->GetNext();

// 削除対象が先頭かどうか
if(DelNode->GetPrev()){ DelNode->GetPrev()->SetNext(wpNextNode); }
else{ m_pTop = wpNextNode; }

// 削除対象が末尾かどうか
if(wpNextNode){ DelNode->GetNext()->SetPrev(DelNode->GetPrev()); }
else { m_pEnd = DelNode->GetPrev(); }

//SAFE_DELETE(DelNode);

if(m_NodeNum>0)
m_NodeNum--;

return wpNextNode;
}

T* GetTop()const { return m_pTop; } // 先頭要素へのポインタを取得
T* GetEnd()const { return m_pEnd; } // 末尾要素へのポインタを取得
int GetNodeNum()const { return m_NodeNum; } // リストで繋がっている数を取得
};




結局循環リストにはせず、先頭・末尾へのポインタを持つことにしました。
繋がっている要素の数を数えるように m_NodeNum を変数として持たせました。

弾が出ている数でボーナスとか考えていたのでそう言う時にも使えるかもしれないし
もしかしたら使わないかもしれない。


しっかりと繋がったかを確認する必要がありますので
それも確認した結果がこちらの画像です(クリックで拡大)

template_list用:双方向リスト結果


template の理解よりも、クラス設計をどうするかで迷ってた気がする・・・
一回使っていると、また template を使う機会が出てくるに違いない。
と言う訳で、ゲーム制作から離れていましたが、非常にいい時間だったと思います。


改めまして、御津凪さん。
コードの提示・アドバイスありがとうございました!
本当に助かりました><


pre タグで囲ったものは仕切りが出来て凄く見やすい。
やっぱ移転して良かった。
ただ、コメントがしにくいw
スポンサーサイト
NEXT≫
検索フォーム
プロフィール

DVDM

Author:DVDM
自作ゲームの開発過程ブログ。
赤髪愛なら誰にも負けない。

 
Pixiv バナー


ブロとも申請フォーム
最新記事
カテゴリ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
ブロとも一覧
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。