テンプレート ベースのクラス
この技術情報では、 MFC バージョン 3.0 のタイプ セーフなテンプレート ベースのコレクション クラスを以降について説明します。これらのテンプレートを使用してタイプセーフなコレクションを作成することが簡単であり、ヘルプは、テンプレート ベースのコレクション クラスを使用してタイプ セーフをより効率的に提供します。
MFC は、テンプレート ベースのコレクションの 2 種類のカテゴリを定義します:
単純な配列、リスト、マップ クラス
CArray, CList, CMap
入力されたポインターの配列、リスト、マップ
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
単純なコレクション クラスはすべて CObjectクラスから派生しているため、 CObjectのシリアル化、動的生成、およびそのほかのプロパティを継承します。入力されたポインターのコレクション クラスは CPtrList または CPtrArrayなどの MFC によって、定義済み非テンプレートのポインターのコレクションの 1 C である必要があり、から派生するクラスを指定する必要があります。新しいコレクション クラスは、指定した基本クラスと新しいクラスのメンバー関数の使用によってカプセル化された呼び出しから基本クラスのメンバーにタイプ セーフを実装するために派生します。
C++ のテンプレートの詳細については、 C++ 言語リファレンスの テンプレート を参照してください。
単純な配列、リスト、マップのテンプレートを使用する
単純なコレクションのテンプレートを使用するには、どのようなデータをこれらのコレクションを格納し、コレクションの宣言で使用するパラメーターを検証する必要があります。
単純な配列とリストの使用
単純なリスト、配列、クラス CArray と CListは、 2 の三つのパラメーターをとります: 型 と ARG_TYPE。これらのクラスは、 型パラメーター に指定されたデータ型を格納できます:
int、 charと 浮動小数点型など、基本的な C++ のデータ型、
C++ の構造体とクラス
ユーザーが定義するそのほかの型
利便性と効率に、関数の引数の型を指定するために ARG_TYPE パラメーターを使用できます。通常、 型パラメーター で指定した型への参照として ARG_TYPE を指定します。次に例を示します。
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
最初の例は intの秒を含む配列、コレクション myArrayを宣言します。2 番目の例は、リスト コレクション、その myListをストアの CPerson のオブジェクト宣言します。コレクション クラスの一部のメンバー関数は、型が ARG_TYPE テンプレート パラメーターで指定される引数を受け取ります。たとえば、クラス CArray の 追加 のメンバー関数は ARG_TYPE の引数を受け取ります:
CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);
単純なマッピングの使用
単純なマッピングのクラス、 CMapは、 4 の三つのパラメーターをとります: キー、 ARG_KEY値、および ARG_VALUE。配列やリスト クラスと同様に、マップのクラスは、データ型を格納できます。格納するデータのインデックスをクリックし、並べ替えリスト、配列とは異なり、マップの関連は調整し、評価します: 値に関連付けられたキーを指定してマップに格納される値にアクセスします。Key パラメーターが マップに格納されているデータ アクセスに使用するキーのデータ型を指定します。キー の型がクラスまたは構造体の場合、 ARG_KEY パラメーターは、通常、 キーで指定された型への参照です。パラメーター値は 、マップに格納されている項目の種類を指定します。ARG_VALUE の型がクラスまたは構造体の場合、 ARG_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 としてマップに格納されますが、ポインター型 LPCSTRして SetAt の関数で参照されます。次に例を示します。
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
入力ポインターのコレクションのテンプレートを使用する
入力ポインターのコレクションのテンプレートを使用するには、どのようなデータをこれらのコレクションを格納し、コレクションの宣言で使用するパラメーターを検証する必要があります。
入力ポインターの配列とリストの使用
入力ポインターの配列、リスト、クラス CTypedPtrArray と CTypedPtrListは、 2 の三つのパラメーターをとります: BASE_CLASS と 型。これらのクラスは、 型パラメーター に指定されたデータ型を格納できます。これらは、非テンプレートのコレクション クラスの 1 つがストアのポインターから派生します; BASE_CLASSでこの基本クラスを指定します。配列の場合、 CObArray か CPtrArrayを使用します。一覧については、 CObList か CPtrListを使用します。
実際に基づいて収集を宣言すると、のみ CObList、新しいクラスを継承しない基本クラスのメンバーを通知しますが、ヘルプが基本クラスのメンバーに呼び出しのカプセル化により、タイプ セーフを提供するか一部のタイプ セーフな追加のメンバー関数と演算子を宣言します。これらのカプセル化、必要なすべての型変換を管理します。次に例を示します。
CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;
最初の例では、入力ポインターの配列 CObArray、から派生した myArrayを宣言します。( CPerson が CObjectから派生したクラスであるか)。 CPerson への配列ストアと戻りのポインターはオブジェクト。CObArray のメンバー関数をダイヤルすることも、新しいタイプ セーフ GetAt と ElementAt の関数をダイヤルするか、タイプ セーフの [] の演算子を使用できます。
2 番目の例では、入力ポインターのリスト、 CPtrListから派生した myListを宣言します。MY_STRUCT への一覧のストアと戻りのポインターはオブジェクト。CPtrList に基づいてクラスは CObjectから派生しないオブジェクトへのポインターを格納するために使用されます。CTypedPtrList に一部のタイプ セーフなメンバー関数があります: GetHead、 GetTail、 RemoveHead、 RemoveTail、 GetNext、 GetPrevと GetAt。
入力ポインターのマップの使用
入力ポインターのマップ クラス、 CTypedPtrMapは、 3 の三つのパラメーターをとります: BASE_CLASS、 キーと 値。BASE_CLASS パラメーターは、新しいクラスを派生するクラスを指定します: CMapPtrToWord、 CMapPtrToPtr、 CMapStringToPtr、 CMapWordToPtr、 CMapStringToObなど。キーはCMapに true に 似ています: これは、参照に使用するキーの種類を指定します。値はCMapで 評価するに 似ています: これは、マップに格納されるオブジェクトの型を指定します。次に例を示します。
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
最初の例は CMapPtrToPtr に基づくマップです — MY_STRUCTへのポインターにマップされている CString のキーを使用します。タイプ セーフな Lookup のメンバー関数を呼び出して、格納されているポインターを検索できます。検索格納されているポインターを検索し、追加するに [] の演算子を使用できます。、タイプ セーフで GetNextAssoc 関数を使用してマップを反復処理できます。また、クラス CMapPtrToPtrの他のメンバー関数をダイヤルできます。
2 番目の例では CMapStringToOb に基づくマップです — CMyObject オブジェクトに格納されているポインターにマップされた文字列キーを使用します。前の段落で説明した同じタイプ セーフのメンバーを使用するか、クラス CMapStringToObのメンバーを呼び出すことができます。
[!メモ]
値パラメーター に クラス(&&C),class,クラス(L),クラス(S),Class,クラス または struct の型を指定する場合は、型へのポインターまたは参照ではなく、クラスまたは構造体はコピー コンストラクターが必要です。
詳細については、 タイプセーフなコレクションを設定する方法を参照してください。