コレクションの全メンバーへのアクセス
MFC の配列コレクション クラスは、テンプレート ベースであり —要素にアクセスするには、インデックスを使用します。MFC のリスト、マップのコレクション クラスは、テンプレート ベースであり —コレクション内の指定された位置を記述するには、インジケーターの型 位置 を使用します。これらのコレクションの一つ以上のメンバーにアクセスするには、最初に位置するティッカーを初期化し、次にコレクションを反復処理し位置に渡され、次の要素を返すように要求します。コレクションは、イテレーションの進行状況に関する状態情報を保持する必要がありません。この情報は、ティッカー場所に保持されます。ただし、特定の場所を指定すると、コレクションは次の要素を返すを行います。
次の手順では、 MFC に用意されているコレクションの 3 種類の主要な型を反復処理する方法を示します:
配列を反復処理すること
リストを処理できます。
マップを処理できます。
配列を反復処理するには
GetAt のメンバー関数の順次インデックス番号を使用する:
CTypedPtrArray<CObArray, CPerson*> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize();i++) { CPerson* thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
この例では CPerson のオブジェクトへのポインターを含む入力されたポインターの配列を使用します。配列は、クラス CObArray、非テンプレートによって定義されたクラスの 1 から派生します。GetAt は CPerson のオブジェクトへのポインターを返します。入力されたポインターのコレクション クラスに対して —配列またはリスト —最初のパラメーターは、基本クラスを指定します; 2 番目のパラメーターは、保存する型を指定します。
CTypedPtrArray のクラスは、配列の要素にアクセスするには、通常の配列が構文を使用できるように [] の演算子をオーバーロードします。上の for ループの本体のステートメントに代わる方法です
CPerson* thePerson = myArray[i];
この演算子は const と非const バージョンの両方に存在します。const の配列に対して呼び出される const バージョンは、代入ステートメントの右側でのみ使用できます。
リストを反復処理するには
リストを順番に操作するためにメンバー関数 GetHeadPosition と GetNext の使用:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
この例では CPerson のオブジェクトへのポインターを格納するために入力されたポインターのリストを使用します。一覧の宣言は、プロシージャ 配列を反復処理するには の配列の 1 種類に似ていますが、クラス CObListから派生します。GetNext は CPerson のオブジェクトへのポインターを返します。
マップを繰り返します。
繰り返し次の例に示すようにマップから次のキーと値を取得するマップと GetNextAssoc の開始にアクセスするには、を GetStartPosition の使用:
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); // Use string and pPerson }
(入力されたポインターのコレクションではなくこの例では、単純なマッピングのテンプレートを使用する CString のキーを使用して、 CPerson のオブジェクトへのポインターを格納します。GetNextAssocのようなアクセス関数を使用すると、クラスが CPerson のオブジェクトへのポインターを提供します。非テンプレートのマップのコレクションの 1 つを使用すると、 CPersonへのポインターに CObject の返されたポインターにキャストします。
[!メモ]
非テンプレートの割り当てに、コンパイラは GetNextAssocに最後のパラメーターの CObject のポインターへの参照が必要です。入力で、次の例に示すように、型へのポインターを、キャストします。
テンプレート ソリューションはより簡単です。また、ヘルプでは、タイプ セーフを提供します。非テンプレート コードは、ここに表示できるように、より複雑です:
CMapStringToOb myMap; // A nontemplate collection class CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, (CObject*&)pPerson); ASSERT(pPerson->IsKindOf( RUNTIME_CLASS(CPerson))); // Use string and pPerson }
詳細については、 CObject のコレクションのすべてのオブジェクトの削除を参照してください。