[ MFC ] CTypedPtrList を使ってクラスオブジェクトのポインタをキュー管理する

Pocket

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


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *