다음을 통해 공유


컬렉션의 모든 멤버에 액세스

템플릿 기반이든 아니든 MFC 배열 컬렉션 클래스는 인덱스를 사용하여 해당 요소에 액세스합니다. 템플릿 기반이든 아니든 MFC 목록 및 맵 컬렉션 클래스는 POSITION 형식의 표시기를 사용하여 컬렉션 내의 지정된 위치를 설명합니다. 이러한 컬렉션의 멤버 하나 이상에 액세스하려면 먼저 위치 표시기를 초기화한 다음 해당 위치를 컬렉션에 반복적으로 전달하고 다음 요소를 반환하도록 요청합니다. 컬렉션은 반복 진행률에 대한 상태 정보를 유지하는 역할을 담당하지 않습니다. 이 정보는 위치 표시기에 유지됩니다. 그러나 특정 위치가 지정된 경우 컬렉션은 다음 요소를 반환합니다.

다음 절차에서는 MFC와 함께 제공되는 세 가지 주요 형식의 컬렉션을 반복하는 방법을 보여 줍니다.

배열을 반복하려면

  1. 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클래스에서 파생됩니다. GetAtCPerson 개체에 대한 포인터를 반환합니다. 형식화된 포인터 컬렉션 클래스(배열 또는 목록)의 경우 첫 번째 매개 변수는 기본 클래스를 지정하고, 두 번째 매개 변수는 저장할 형식을 지정합니다.

    또한 클래스는 CTypedPtrArray [] 연산자를 오버로드하므로 사용자 지정 배열-아래 첨자 구문을 사용하여 배열의 요소에 액세스할 수 있습니다. 위 for 루프 본문의 문을 대체하는 문은 다음과 같습니다.

    CPerson *thePerson = myArray[i];
    

    이 연산자는 버전이 아닌const 버전 모두 const 에 있습니다. const 배열에 대해 const 호출되는 버전은 대입 문의 오른쪽에만 표시될 수 있습니다.

목록을 반복하려면

  1. GetHeadPositionGetNext 멤버 함수를 사용하여 목록 작업을 수행합니다.

    CTypedPtrList<CObList, CPerson *> myList;
    
    myList.AddHead(new CPerson());
    POSITION pos = myList.GetHeadPosition();
    while (pos != NULL)
    {
       CPerson *thePerson = myList.GetNext(pos);
       thePerson->AssertValid();
    }
    

    이 예제에서는 형식화된 포인터 목록을 사용하여 CPerson 개체에 대한 포인터를 포함합니다. 목록 선언은 배열을 반복하려면 절차의 배열에 대한 선언과 유사하지만 CObList클래스에서 파생됩니다. GetNextCPerson 개체에 대한 포인터를 반환합니다.

맵을 반복하려면

  1. 다음 예제와 같이 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 컬렉션의 모든 개체 삭제를 참조하세요.

참고 항목

컬렉션