템플릿 기반 클래스
이 문서에서는 MFC 버전 3.0 이상에서 형식이 안전한 템플릿 기반 컬렉션 클래스에 대해 설명합니다. 이러한 템플릿을 사용하여 형식이 안전한 컬렉션을 만드는 것이 더 편리하며 템플릿을 기반으로 하지 않는 컬렉션 클래스를 사용하는 것보다 형식 안전을 보다 효과적으로 제공할 수 있습니다.
MFC는 템플릿 기반 컬렉션의 두 범주를 미리 정의합니다.
-
CArray
,CList
,CMap
-
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
단순 컬렉션 클래스는 모두 클래스 CObject
에서 파생되므로 serialization, 동적 만들기 및 기타 속성을 CObject
상속합니다. 형식화된 포인터 컬렉션 클래스를 사용하려면 MFC CPtrList
CPtrArray
에서 미리 정의한 비템플레이트 포인터 컬렉션 중 하나여야 하는 파생 클래스를 지정해야 합니다. 새 컬렉션 클래스는 지정된 기본 클래스에서 상속되며, 새 클래스의 멤버 함수는 기본 클래스 멤버에 대한 캡슐화된 호출을 사용하여 형식 보안을 적용합니다.
C++ 템플릿 에 대한 자세한 내용은 C++ 언어 참조의 템플릿 을 참조하세요.
단순 배열, 목록 및 맵 템플릿 사용
간단한 컬렉션 템플릿을 사용하려면 이러한 컬렉션에 저장할 수 있는 데이터의 종류와 컬렉션 선언에 사용할 매개 변수를 알아야 합니다.
단순 배열 및 목록 사용
간단한 배열 및 목록 클래스인 CArray 및 CList는 TYPE 및 ARG_TYPE
. 이러한 클래스는 TYPE 매개 변수에 지정하는 모든 데이터 형식을 저장할 수 있습니다.
기본 C++ 데이터 형식(예:
int
, 및)char
float
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, VALUE 및 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
항목을 반환합니다. 두 번째 예제에서는 값을 저장 CPerson
하고, 키로 CString
액세스하고, 액세스된 항목에 대한 참조를 반환합니다. 이 예제에서는 성으로 사람을 조회하는 간단한 주소록을 나타낼 수 있습니다.
KEY 매개 변수는 형식 CString
이고 KEY_TYPE 매개 변수는 형식LPCSTR
이므로 키는 형식의 항목으로 맵에 저장되지만 형식 LPCSTR
CString
의 포인터를 통해와 같은 SetAt
함수에서 참조됩니다. 예시:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Typed-Pointer 컬렉션 템플릿 사용
형식화된 포인터 컬렉션 템플릿을 사용하려면 이러한 컬렉션에 저장할 수 있는 데이터의 종류와 컬렉션 선언에 사용할 매개 변수를 알아야 합니다.
형식화된 포인터 배열 및 목록 사용
형식화된 포인터 배열 및 목록 클래스인 CTypedPtrArray 및 CTypedPtrList는 BASE_CLASS 및 TYPE이라는 두 개의 매개 변수를 사용합니다. 이러한 클래스는 TYPE 매개 변수에 지정한 모든 데이터 형식을 저장할 수 있습니다. 포인터를 저장하는 비템플레이트 컬렉션 클래스 중 하나에서 파생됩니다. BASE_CLASS 이 기본 클래스를 지정합니다. 배열의 경우 또는 CObArray
CPtrArray
. 목록의 경우 다음 중 하나 CObList
또는 CPtrList
를 사용합니다.
실제로 컬렉션을 기반으로 선언할 때 새 클래스는 기본 클래스의 멤버를 상속할 뿐만 아니라 기본 클래스 멤버에 대한 CObList
호출을 캡슐화하여 형식 보안을 제공하는 데 도움이 되는 다양한 추가 형식 안전 멤버 함수 및 연산자를 선언합니다. 이러한 캡슐화는 필요한 모든 형식 변환을 관리합니다. 예시:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
첫 번째 예제에서는 .에서 CObArray
파생된 형식화된 포인터 배열myArray
을 선언합니다. 배열은 개체(여기서 CPerson
파생된 CObject
클래스)에 대한 포인터 CPerson
를 저장하고 반환합니다. 멤버 함수를 CObArray
호출하거나 새 형식 안전 GetAt
및 ElementAt
함수를 호출하거나 형식 안전 [ ] 연산자를 사용할 수 있습니다.
두 번째 예제에서는 에서 파생CPtrList
된 형식화된 포인터 목록을 myList
선언합니다. 목록은 개체에 MY_STRUCT
대한 포인터를 저장하고 반환합니다. 기반 CPtrList
클래스는 에서 파생 CObject
되지 않은 개체에 대한 포인터를 저장하는 데 사용됩니다. CTypedPtrList
에는 형식이 안전한 멤버 함수GetHead
, 즉 , GetTail
, RemoveHead
RemoveTail
, GetNext
GetPrev
및 GetAt
.
형식화된 포인터 맵 사용
형식화된 포인터 맵 클래스인 CTypedPtrMap은 BASE_CLASS, KEY 및 VALUE의 세 가지 매개 변수를 사용합니다. BASE_CLASS 매개 변수는 새 클래스를 파생시킬 클래스CMapPtrToWord
를 CMapStringToOb
CMapWordToPtr
CMapStringToPtr
CMapPtrToPtr
지정합니다. 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-금고 컬렉션을 만드는 방법을 참조하세요.