ここでは、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 を使って、キューなのかスタックなのかといったことを明示的にして、さらにソースコードもすっきり