スタック コレクションとキュー コレクションの作成
ここでは、スタックやキューなどのデータ構造を MFC のリスト クラスで実現する方法について説明します。 ここでは CList の派生クラスを使用します。機能を拡張する必要がない場合は、CList をそのまま使用できます。
スタック
標準のリスト コレクションには先頭と末尾があるので、後入れ先出し (LIFO) スタックと同じように動作するリスト コレクションを簡単に派生できます。 スタックは、カフェテリアにあるトレーのスタック (積み重ね) に似ています。 トレーを追加するときは、スタックの一番上に乗せます。 最後に乗せたトレーを最初に使用します。 リスト コレクションのメンバー関数 AddHead と RemoveHead は、要素の追加と取り出しをリストの先頭で行います。つまり、最後に追加した要素が最初に取り出されます。
スタック コレクションを作成するには
MFC が提供する既存のリスト クラスから新しいリスト クラスを派生し、スタック操作をサポートするメンバー関数を追加します。
次の例では、要素のプッシュ、ピーク、ポップをスタックの先頭で行うメンバー関数を追加します。
class CTray : public CObject { }; class CStack : public CTypedPtrList< CObList, CTray* > { public: // Add element to top of stack void Push( CTray* newTray ) { AddHead( newTray ); } // Peek at top element of stack CTray* Peek() { return IsEmpty() ? NULL : GetHead(); } // Pop top element off stack CTray* Pop() { return RemoveHead(); } };
この方法では、基になっている CObList クラスが公開されます。 スタックに関係するものかどうかにかかわらず、任意の CObList メンバー関数を呼び出すことができます。
キュー
標準のリスト コレクションには先頭と末尾があるので、先入れ先出し (FIFO) キューと同じように動作するリスト コレクションを簡単に派生できます。 キューは、カフェテリアで順番を待っている人の行列に似ています。 列の先頭の人が、最初にサービスを受けます。 新しく到着した人は、列の最後に付いてサービスを待ちます。 リスト コレクションのメンバー関数 AddTail と RemoveHead は、リストの末尾に要素を追加し、リストの先頭から要素を取り出します。つまり、最後に追加した要素は最後に取り出されます。
キュー コレクションを作成するには
MFC が提供する定義済みのリスト クラスから新しいリスト クラスを派生し、キュー操作をサポートするメンバー関数を追加します。
次の例では、キューの最後に要素を登録するメンバー関数と、キューの先頭から要素を取り出すメンバー関数を追加しています。
class CQueue : public CTypedPtrList< CObList, CPerson* > { public: // Go to the end of the line void AddToEnd( CPerson* newPerson ) { AddTail( newPerson ); } // End of the queue // Get first element in line CPerson* GetFromFront() { return IsEmpty() ? NULL : RemoveHead(); } };