다음을 통해 공유


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

템플릿 기반이 아닌 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 컬렉션의 모든 개체 삭제를 참조하세요.

참고하십시오

컬렉션