다음을 통해 공유


템플릿 기반 클래스

이 문서에서는 MFC 버전 3.0 이상에서 형식이 안전한 템플릿 기반 컬렉션 클래스에 대해 설명합니다. 이러한 템플릿을 사용하여 형식이 안전한 컬렉션을 만드는 것이 더 편리하며 템플릿을 기반으로 하지 않는 컬렉션 클래스를 사용하는 것보다 형식 안전을 보다 효과적으로 제공할 수 있습니다.

MFC는 템플릿 기반 컬렉션의 두 범주를 미리 정의합니다.

단순 컬렉션 클래스는 모두 클래스 CObject에서 파생되므로 serialization, 동적 만들기 및 기타 속성을 CObject상속합니다. 형식화된 포인터 컬렉션 클래스를 사용하려면 MFC CPtrListCPtrArray에서 미리 정의한 비템플레이트 포인터 컬렉션 중 하나여야 하는 파생 클래스를 지정해야 합니다. 새 컬렉션 클래스는 지정된 기본 클래스에서 상속되며, 새 클래스의 멤버 함수는 기본 클래스 멤버에 대한 캡슐화된 호출을 사용하여 형식 보안을 적용합니다.

C++ 템플릿 에 대한 자세한 내용은 C++ 언어 참조의 템플릿참조하세요.

단순 배열, 목록 및 맵 템플릿 사용

간단한 컬렉션 템플릿을 사용하려면 이러한 컬렉션에 저장할 수 있는 데이터의 종류와 컬렉션 선언에 사용할 매개 변수를 알아야 합니다.

단순 배열 및 목록 사용

간단한 배열 및 목록 클래스인 CArray 및 CList는 TYPEARG_TYPE. 이러한 클래스는 TYPE 매개 변수에 지정하는 모든 데이터 형식을 저장할 수 있습니다.

  • 기본 C++ 데이터 형식(예: int, 및) charfloat

  • C++ 구조체 및 클래스

  • 정의하는 기타 형식

편의성과 효율성을 위해 ARG_TYPE 매개 변수를 사용하여 함수 인수의 형식을 지정할 수 있습니다. 일반적으로 ARG_TYPE TYPE 매개 변수에서 명명한 형식에 대한 참조로 지정합니다. 예시:

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

첫 번째 예제에서는 **int**를 포함하는 배열 컬렉션을 myArray선언합니다. 두 번째 예제에서는 개체를 저장하는 CPerson 목록 컬렉션을 myList선언합니다. 컬렉션 클래스의 특정 멤버 함수는 형식이 ARG_TYPE 템플릿 매개 변수로 지정된 인수를 사용합니다. 예를 들어 클래스의 Add 멤버 함수는 ARG_TYPE 인수를 사용합니다.CArray

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

단순 맵 사용

간단한 맵 클래스인 CMap은 KEY, ARG_KEY, VALUEARG_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 항목을 반환합니다. 두 번째 예제에서는 값을 저장 CPerson 하고, 키로 CString 액세스하고, 액세스된 항목에 대한 참조를 반환합니다. 이 예제에서는 성으로 사람을 조회하는 간단한 주소록을 나타낼 수 있습니다.

KEY 매개 변수는 형식 CString 이고 KEY_TYPE 매개 변수는 형식LPCSTR이므로 키는 형식의 항목으로 맵에 저장되지만 형식 LPCSTRCString 의 포인터를 통해와 같은 SetAt 함수에서 참조됩니다. 예시:

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

Typed-Pointer 컬렉션 템플릿 사용

형식화된 포인터 컬렉션 템플릿을 사용하려면 이러한 컬렉션에 저장할 수 있는 데이터의 종류와 컬렉션 선언에 사용할 매개 변수를 알아야 합니다.

형식화된 포인터 배열 및 목록 사용

형식화된 포인터 배열 및 목록 클래스인 CTypedPtrArrayCTypedPtrList는 BASE_CLASSTYPE이라는 두 개의 매개 변수를 사용합니다. 이러한 클래스는 TYPE 매개 변수에 지정한 모든 데이터 형식을 저장할 수 있습니다. 포인터를 저장하는 비템플레이트 컬렉션 클래스 중 하나에서 파생됩니다. BASE_CLASS 이 기본 클래스를 지정합니다. 배열의 경우 또는 CObArrayCPtrArray. 목록의 경우 다음 중 하나 CObList 또는 CPtrList를 사용합니다.

실제로 컬렉션을 기반으로 선언할 때 새 클래스는 기본 클래스의 멤버를 상속할 뿐만 아니라 기본 클래스 멤버에 대한 CObList호출을 캡슐화하여 형식 보안을 제공하는 데 도움이 되는 다양한 추가 형식 안전 멤버 함수 및 연산자를 선언합니다. 이러한 캡슐화는 필요한 모든 형식 변환을 관리합니다. 예시:

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

첫 번째 예제에서는 .에서 CObArray파생된 형식화된 포인터 배열myArray을 선언합니다. 배열은 개체(여기서 CPerson 파생된 CObject클래스)에 대한 포인터 CPerson 를 저장하고 반환합니다. 멤버 함수를 CObArray 호출하거나 새 형식 안전 GetAtElementAt 함수를 호출하거나 형식 안전 [ ] 연산자를 사용할 수 있습니다.

두 번째 예제에서는 에서 파생CPtrList된 형식화된 포인터 목록을 myList선언합니다. 목록은 개체에 MY_STRUCT 대한 포인터를 저장하고 반환합니다. 기반 CPtrList 클래스는 에서 파생 CObject되지 않은 개체에 대한 포인터를 저장하는 데 사용됩니다. CTypedPtrList에는 형식이 안전한 멤버 함수GetHead, 즉 , GetTail, RemoveHeadRemoveTail, GetNextGetPrevGetAt.

형식화된 포인터 맵 사용

형식화된 포인터 맵 클래스인 CTypedPtrMap은 BASE_CLASS, KEYVALUE의 세 가지 매개 변수를 사용합니다. BASE_CLASS 매개 변수는 새 클래스를 파생시킬 클래스CMapPtrToWordCMapStringToObCMapWordToPtrCMapStringToPtrCMapPtrToPtr지정합니다. KEY는 키CMap유사합니다. 조회에 사용되는 키의 형식을 지정합니다. VALUE는 VALUE의 CMap과 유사합니다. 맵에 저장된 개체의 형식을 지정합니다. 예시:

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

첫 번째 예제는 포인터에 매핑된 키를 사용하는 CString 맵을 기반으로 CMapPtrToPtr 합니다MY_STRUCT. 형식이 안전한 Lookup 멤버 함수를 호출하여 저장된 포인터를 조회할 수 있습니다. [] 연산자를 사용하여 저장된 포인터를 조회하고 찾을 수 없는 경우 추가할 수 있습니다. 또한 형식 안전 GetNextAssoc 함수를 사용하여 맵을 반복할 수 있습니다. 클래스 CMapPtrToPtr의 다른 멤버 함수를 호출할 수도 있습니다.

두 번째 예제는 개체에 저장된 포인터에 매핑된 문자열 키를 사용하는 맵을 CMapStringToOb 기반으로 합니다 CMyObject . 이전 단락에서 설명한 것과 동일한 형식 안전 멤버를 사용하거나 클래스 CMapStringToOb의 멤버를 호출할 수 있습니다.

참고 항목

형식에 class 대한 포인터나 struct 참조가 아닌 VALUE 매개 변수에 대해 형식을 지정하는 경우 클래스 또는 구조체에 복사 생성자가 있어야 합니다.

자세한 내용은 Type-금고 컬렉션을 만드는 방법을 참조하세요.

참고 항목

컬렉션