次の方法で共有


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

更新 : 2007 年 11 月

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

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

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

    CArray, CList, CMap

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

    CTypedPtrArray, CTypedPtrList, CTypedPtrMap

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

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

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

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

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

CArrayCList などの単純な配列やリストのクラスは TYPE と ARG_TYPE の 2 つのパラメータを使用します。これらのクラスにはあらゆる型のデータを格納できます。格納する型は、パラメータ 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 は、KEY、ARG_KEY、VALUE、ARG_VALUE の 4 つのパラメータを使用します。配列およびリストと同じように、マップ クラスには任意のデータ型を格納できます。配列およびリストでは、データにインデックスを付け、順番を指定しますが、マップ クラスではキーと値を対応付けます。したがって、キーを使用してマップ内の値にアクセスできます。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);

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

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

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

CTypedPtrArray クラスや CTypedPtrList クラスなどの型付きポインタの配列やリストには、BASE_CLASS および TYPE の 2 つのパラメータが指定されています。これらのクラスには、任意の型のオブジェクトを 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 には、GetHeadGetTailRemoveHeadRemoveTailGetNextGetPrev、および GetAt などの多数のタイプ セーフなメンバ関数があります。

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

型付きポインタのマップ クラス CTypedPtrMap は、BASE_CLASS、KEYVALUE の 3 つのパラメータを使用します。BASE_CLASS パラメータでは、作成するクラスの基本クラス (CMapPtrToWordCMapPtrToPtrCMapStringToPtrCMapWordToPtrCMapStringToObなど) を指定します。KEY パラメータでは、CMapクラスと同じように、検索に使うキーの型を指定します。VALUE パラメータでは、CMap クラスと同じように、マップに格納するオブジェクトの型を指定します。次に例を示します。

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

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

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

f728cbk3.alert_note(ja-jp,VS.90).gifメモ :

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

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

参照

概念

コレクション クラス