ここでは、vc++ で CTypedPtrList を使ったキュー管理のサンプルを紹介します。サンプルコードでは、実際に活用される頻度が高いと思われるユーザー定義クラスのポインタをキューで管理しています。
スポンサーリンク
キューでは、 FIFO(先入れ、先出し)でデータを管理します。FIFOとは、「First In, First Out」の頭文字をつなげたものですね。
キューに格納するサンプルクラス
ここで使用するサンプルコードで使用するキューに格納するクラスは、以下のようにセッターとゲッターのみを持った簡単なクラスとします。
class MyObject {
protected:
int _Value;
public:
// コンストラクタ
MyObject(int value) {_Value = value;}
// デストラクタ
~MyObject(void) {};
// setter
void SetValue(int value) { _Value = value; }
// getter
int GetValue() { return _Value; }
};
次に示すコードは、キューへのデータの格納と取り出しを行うサンプルコードです。詳細はコメントを確認してください。
/*
* CTypedPtrList でキュー管理を行う
* typedef で別名を定義しておいたほうが、わかりやすくすっきりとした
* ソースコードが記述できる
* 特に、キューなのかスタックなのかや、何のデータが入っているかが
* 明確になることが良い
*/
typedef CTypedPtrList<CPtrList, MyObject*> MyQueue;
// キューの宣言
MyQueue mq;
// キューに値を格納(1つ目)
MyObject* pMyObject1 = new MyObject(1);
mq.AddTail(pMyObject1);
// キューに値を格納(2つ目)
MyObject* pMyObject2 = new MyObject(2);
mq.AddTail(pMyObject2);
// 最初に格納したデータを取り出す
MyObject* pMyObject3 = mq.RemoveHead();
cout << pMyObject3->GetValue() << endl; // 1
// キューから取り出すだけでは不十分。delete しないと、メモリーリークする
delete pMyObject3;
// 2つ目に格納したデータを取り出す
MyObject* pMyObject4 = mq.RemoveHead();
std::cout << pMyObject4->GetValue() << endl; // 2
delete pMyObject4;
ポイント
- 上記のサンプルコードでは、データの取り出しに RemoveHead メソッドを使用していますが、RemoveTail メソッドに変更することでFIFO から FILO(First In, Last Out) に変更できる
- キューから取り出した上でメモリを解放(delete)
- typedef を使って、キューなのかスタックなのかといったことを明示的にして、さらにソースコードもすっきり