次の方法で共有


テンプレート ベースのクラス

ここでは、MFC 3.0 以降のテンプレート ベースのタイプ セーフなコレクション クラスについて説明します。 テンプレートを使ってタイプ セーフなコレクションを作成すると、テンプレートに基づいていないコレクション クラスより使いやすく、より確実にタイプ セーフなコレクションを提供できます。

MFC では、テンプレート ベースのコレクション クラスとして次の 2 種類が定義済みです。

  • 配列、リスト、マップなどの単純なテンプレート

    CArray, CList, CMap

  • 型付きポインターのコレクション テンプレート

    CTypedPtrArray, CTypedPtrList, CTypedPtrMap

単純なコレクション クラスはすべて CObject からの派生クラスなので、シリアル化、動的生成などの特性を CObject から継承します。 型付きポインターのコレクション クラスを使用する場合は、MFC で定義済みの非テンプレート コレクション クラス (CPtrListCPtrArray など) を基本クラスとして指定する必要があります。 派生したコレクション クラスは、指定した基本クラスから特性を継承するだけでなく、基本クラスのメンバー関数への呼び出しがカプセル化されているので、確実に型が保証されます。

C++ のテンプレートの詳細については、『C++ Language Reference』の「Templates」を参照してください。

配列、リスト、マップなどの単純なテンプレートの使用

単純なコレクション テンプレートを使用する場合は、これらのコレクションに格納できるデータの種類と、コレクションを宣言するときのパラメーターを知っている必要があります。

単純な配列やリストの使い方

単純な配列やリストのクラスは、CArrayCList、2 つのパラメーターを取る。TYPE and ARG_TYPE. これらのクラスにはあらゆる型のデータを格納できます。格納する型は、パラメーター TYPE で指定します。

  • int、char、float などの C++ の基本データ型

  • C++ の構造体およびクラス

  • その他のユーザー定義型

関数の引数の型は、パラメーター ARG_TYPE で簡単でまた効率的に指定できます。 通常、ARG_TYPE には、TYPE パラメーターで指定した型の参照を指定します。 次に例を示します

CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;

最初の例では、int を含む myArray という配列のコレクションを宣言しています。 2 番目の例では、CPerson オブジェクトを保持する myList というリスト コレクションを宣言しています。 コレクション クラスのメンバー関数の中には、テンプレートのパラメーター ARG_TYPE で指定した型の引数を使用するものもあります。 たとえば、CArray クラスのメンバー関数 Add は、次のように引数として ARG_TYPEを使用します。

CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);

単純なマップ クラスの使い方

単純なマップ クラスCMap、4 つのパラメーターを取ります。KEY, ARG_KEY, VALUE, and ARG_VALUE. 配列およびリストと同じように、マップ クラスには任意のデータ型を格納できます。 配列とインデックスし、格納されているデータを注文、リストとは異なりマップはキーと値を関連付けます。マップの値の関連付けられているキーを指定することによって保存されている値を表示します。 KEY パラメーターで、キーのデータ型を指定します。 KEY で構造体型またはクラス型を指定したときは、通常、ARG_KEY パラメーターを KEY で指定した型の参照型にします。 VALUE パラメーターで、マップに格納するデータの型を指定します。 ARG_VALUE で構造体型またはクラスを指定したときは、通常、ARG_VALUE パラメーターを引数 VALUE の参照型にします。 次に例を示します

CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;

最初の例では、MY_STRUCT 型の値を格納し、int 型のキーでアクセスします。見つかった MY_STRUCT 型の値は参照型で返します。 2 番目の例では、CPerson 型の値を格納し、CString 型のキーでアクセスします。見つかった値は参照で返します。 この例は、姓から人物を探せる簡単な住所録です。

KEY パラメーターは CString 型であり、KEY_TYPE パラメーターは LPCSTR 型です。したがって、マップに格納されるキーは CString 型の要素ですが、関数 SetAt などでは LPCSTR 型のポインターで参照されます。 次に例を示します

CMap< CString, LPCTSTR, CPerson, CPerson& > myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);

型付きポインターのコレクション テンプレートの使用

型付きポインターのコレクション テンプレートを使用するには、コレクションに格納できるデータの種類と、コレクションを宣言するときのパラメーターを知っている必要があります。

型付きポインターの配列およびリストの使い方

型付きポインター配列とリストのクラスは、CTypedPtrArrayCTypedPtrList、2 つのパラメーターを取る。BASE_CLASSand TYPE. これらのクラスには、任意の型のオブジェクトを TYPE パラメーターで指定して格納できます。 これらのクラスは、ポインター格納用の非テンプレート コレクション クラスの派生クラスです。基本クラスは、BASE_CLASS パラメーターで指定します。 配列の場合は、CObArray または CPtrArray を指定します。 リストの場合は、CObList または CPtrList を指定します。

たとえば、CObList クラスを基本クラスにしてコレクションを宣言すると、基本クラスのメンバーを継承できるほか、新しいタイプ セーフなメンバー関数と演算子も宣言できます。新しいメンバー関数と演算子は、基本クラスのメンバーへの呼び出しをカプセル化することによって型を保証します。 必要な型変換は、このカプセル化によってすべて処理されます。 次に例を示します

CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;

最初の例では、CObArray から派生した型付きポインターの配列 myArray を宣言しています。 この配列には CPerson オブジェクトへのポインターが格納されます (CPerson が CObject の派生クラスの場合)。 このクラスでは、CObArray クラスの任意のメンバー関数を呼び出すことも、タイプ セーフな新しい関数 GetAtElementAt を呼び出すこともできます。タイプ セーフな演算子 [ ] も使用できます。

2 番目の例では、型付きポインターのリスト myList を CPtrList クラスから派生しています。 このリストには MY_STRUCT オブジェクトへのポインターが格納されます。 CPtrList に基づくクラスは、CObject から派生していないオブジェクトへのポインターを保存するために使用します。 CTypedPtrListタイプ セーフなメンバー関数の数があります。GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, and GetAt.

型付きポインター マップの使い方

型付きポインター マップ クラスCTypedPtrMap、3 つのパラメーターを取ります。BASE_CLASS, KEY, and VALUE. BASE_CLASSパラメーターには、新しいクラスを派生するクラスを指定します。CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb, and so on. キーに似ていますキーCMap:それには、検索に使用されるキーの種類を指定します。 に似ていますCMap:それには、マップに格納されているオブジェクトの種類を指定します。 次に例を示します

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

最初の例は、CMapPtrToPtr を基本クラスとするマップです。MY_STRUCT へのポインターに CString 型のキーを対応付けます。 格納されているポインターを検索するには、タイプ セーフなメンバー関数 Lookup を呼び出します。 [ ] 演算子では、格納されているポインターを検索し、見つからない場合はそのポインターを登録できます。 マップ内の要素を順番にたどるには、タイプ セーフなメンバー関数 GetNextAssoc を使用します。 CMapPtrToPtr クラスのほかのメンバー関数も使用できます。

2 番目の例は、CMapStringToOb を基本クラスとするマップです。キーは文字列であり、格納されている CMyObject オブジェクトへのポインターに対応付けられます。 上と同じタイプ セーフなメンバー関数を使用することも、CMapStringToOb クラスのメンバー関数を呼び出すこともできます。

注意

VALUE パラメーターで、ポインターや参照ではなく、class またはstruct 型を指定する場合は、コピー コンストラクターのあるクラスまたは構造体を指定してください。

詳細については、「方法 : タイプ セーフなコレクションを作成する」を参照してください。

参照

概念

コレクション クラス