컬렉션의 모든 멤버에 액세스
템플릿 기반이든 아니든 MFC 배열 컬렉션 클래스는 인덱스를 사용하여 해당 요소에 액세스합니다. 템플릿 기반이든 아니든 MFC 목록 및 맵 컬렉션 클래스는 POSITION 형식의 표시기를 사용하여 컬렉션 내의 지정된 위치를 설명합니다. 이러한 컬렉션의 멤버 하나 이상에 액세스하려면 먼저 위치 표시기를 초기화한 다음 해당 위치를 컬렉션에 반복적으로 전달하고 다음 요소를 반환하도록 요청합니다. 컬렉션은 반복 진행률에 대한 상태 정보를 유지하는 역할을 담당하지 않습니다. 이 정보는 위치 표시기에 유지됩니다. 그러나 특정 위치가 지정된 경우 컬렉션은 다음 요소를 반환합니다.
다음 절차에서는 MFC와 함께 제공되는 세 가지 주요 형식의 컬렉션을 반복하는 방법을 보여 줍니다.
배열을 반복하려면
GetAt
멤버 함수에서 순차적인 인덱스 번호를 사용합니다.CTypedPtrArray<CObArray, CPerson *> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize(); i++) { CPerson *thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
이 예제에서는
CPerson
개체에 대한 포인터를 포함하는 형식화된 포인터 배열을 사용합니다. 이 배열은 미리 정의된 비템플릿 클래스 중 하나인CObArray
클래스에서 파생됩니다.GetAt
는CPerson
개체에 대한 포인터를 반환합니다. 형식화된 포인터 컬렉션 클래스(배열 또는 목록)의 경우 첫 번째 매개 변수는 기본 클래스를 지정하고, 두 번째 매개 변수는 저장할 형식을 지정합니다.또한 클래스는
CTypedPtrArray
[] 연산자를 오버로드하므로 사용자 지정 배열-아래 첨자 구문을 사용하여 배열의 요소에 액세스할 수 있습니다. 위for
루프 본문의 문을 대체하는 문은 다음과 같습니다.CPerson *thePerson = myArray[i];
이 연산자는 버전이 아닌
const
버전 모두const
에 있습니다.const
배열에 대해const
호출되는 버전은 대입 문의 오른쪽에만 표시될 수 있습니다.
목록을 반복하려면
GetHeadPosition
및GetNext
멤버 함수를 사용하여 목록 작업을 수행합니다.CTypedPtrList<CObList, CPerson *> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while (pos != NULL) { CPerson *thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
이 예제에서는 형식화된 포인터 목록을 사용하여
CPerson
개체에 대한 포인터를 포함합니다. 목록 선언은 배열을 반복하려면 절차의 배열에 대한 선언과 유사하지만CObList
클래스에서 파생됩니다.GetNext
는CPerson
개체에 대한 포인터를 반환합니다.
맵을 반복하려면
다음 예제와 같이
GetStartPosition
을 사용하여 맵을 시작 부분을 가져오고GetNextAssoc
를 사용하여 맵에서 다음 키 및 값을 반복적으로 가져옵니다.CMap<CString, LPCTSTR, CPerson *, CPerson *> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while (pos != NULL) { CPerson *pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); // Use string and pPerson }
이 예제에서는 형식화된 포인터 컬렉션 대신,
CString
키를 사용하고CPerson
개체에 대한 포인터를 저장하는 단순 맵 템플릿을 사용합니다.GetNextAssoc
와 같은 액세스 함수를 사용하는 경우 클래스는CPerson
개체에 대한 포인터를 제공합니다. 대신 비템플릿 맵 컬렉션 중 하나를 사용하는 경우에는 반환된CObject
포인터를CPerson
에 대한 포인터로 캐스팅해야 합니다.참고 항목
비템플릿 맵의 경우 컴파일러는
CObject
의 마지막 매개 변수에GetNextAssoc
포인터에 대한 참조를 필요로 합니다. 다음 예제와 같이 입력에서 포인터를 해당 형식으로 캐스팅해야 합니다.템플릿 솔루션은 보다 간단하며 더 나은 형식 안전성을 제공하는 데 도움이 됩니다. 비템플릿 코드는 여기에서 볼 수 있듯이 더 복잡합니다.
CMapStringToOb myMap; // A nontemplate collection class CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while (pos != NULL) { CPerson *pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, (CObject *&)pPerson); ASSERT(pPerson->IsKindOf(RUNTIME_CLASS(CPerson))); // Use string and pPerson ... }
자세한 내용은 CObject 컬렉션의 모든 개체 삭제를 참조하세요.