다음을 통해 공유


방법: 형식이 안전한 컬렉션 만들기

이 문서에서는 사용자 고유의 데이터 형식에 대해 형식이 안전한 컬렉션을 만드는 방법을 설명합니다. 다룰 주제는 다음과 같습니다.

Microsoft Foundation 클래스 라이브러리는 C++ 템플릿을 기반으로 미리 정의된 형식 안전 컬렉션을 제공합니다. 템플릿이기 때문에 이러한 클래스는 형식 캐스팅 및 비템플레이트 클래스 사용에 관련된 기타 추가 작업 없이도 형식 안전성과 사용 편의성을 제공합니다. MFC 샘플 COLLECT 는 MFC 애플리케이션에서 템플릿 기반 컬렉션 클래스를 사용하는 방법을 보여 줍니다. 일반적으로 새 컬렉션 코드를 작성할 때마다 이러한 클래스를 사용합니다.

형식 금고ty에 템플릿 기반 클래스 사용

템플릿 기반 클래스를 사용하려면

  1. 컬렉션 클래스 형식의 변수를 선언합니다. 예시:

    CList<int, int> m_intList;
    
  2. 컬렉션 개체의 멤버 함수를 호출합니다. 예시:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. 필요한 경우 도우미 함수 및 SerializeElements를 구현합니다. 이러한 함수를 구현하는 방법에 대한 자세한 내용은 도우미 함수 구현을 참조 하세요.

이 예제에서는 정수 목록의 선언을 보여 줍니다. 1단계의 첫 번째 매개 변수는 목록의 요소로 저장된 데이터 형식입니다. 두 번째 매개 변수는 컬렉션 클래스의 멤버 함수(예 AddGetAt: 및 )에서 데이터를 전달하고 반환하는 방법을 지정합니다.

도우미 함수 구현

템플릿 기반 컬렉션 클래스는 CMap 파생 컬렉션 클래스CListCArray에 필요에 따라 사용자 지정할 수 있는 5개의 전역 도우미 함수를 사용합니다. 이러한 도우미 함수에 대한 자세한 내용은 MFC 참조의 컬렉션 클래스 도우미참조하세요. serialization 함수의 구현은 템플릿 기반 컬렉션 클래스의 대부분 사용에 필요합니다.

요소 직렬화

CListCMap 클래스는 CArray컬렉션 요소를 보관 파일에서 저장하거나 읽도록 호출 SerializeElements 합니다.

도우미 함수의 SerializeElements 기본 구현은 개체에서 아카이브로 비트 쓰기를 수행하거나, 개체가 보관에 저장되거나 아카이브에서 검색되는지에 따라 아카이브에서 개체로 비트 읽기를 수행합니다. 이 작업이 적절하지 않은 경우 재정 SerializeElements 의합니다.

컬렉션에서 CObject 파생된 개체를 저장하고 컬렉션 요소 클래스의 구현에서 매크로를 사용하는 IMPLEMENT_SERIAL 경우 기본 제공 CArchiveCObject다음의 serialization 기능을 활용할 수 있습니다.

CArray< CPerson, CPerson& > personArray;

template <> void AFXAPI SerializeElements <CPerson>(CArchive& ar,
   CPerson* pNewPersons, INT_PTR nCount)
{
   for (int i = 0; i < nCount; i++, pNewPersons++)
   {
      // Serialize each CPerson object
      pNewPersons->Serialize(ar);
   }
}

CPerson 개체에 대한 CArchive 호출 CObject::Serialize (또는 해당 함수의 재정의)에 대해 오버로드된 삽입 연산자입니다.

Nontemplate 컬렉션 클래스 사용

MFC는 MFC 버전 1.0에서 도입된 컬렉션 클래스도 지원합니다. 이러한 클래스는 템플릿을 기반으로 하지 않습니다. 지원되는 형식CObject*, UINTDWORDCString.의 데이터를 포함하는 데 사용할 수 있습니다. 이러한 미리 정의된 컬렉션(예: CObList)을 사용하여 파생된 CObject개체의 컬렉션을 저장할 수 있습니다. 또한 MFC는 원시 형식(예 UINT : void 포인터)void*을 보유하는 다른 미리 정의된 컬렉션을 제공합니다. 그러나 일반적으로 보다 구체적인 클래스 및 파생 개체의 개체를 보유하도록 형식이 안전한 컬렉션을 정의하는 것이 유용한 경우가 많습니다. 템플릿을 기반으로 하지 않는 컬렉션 클래스를 사용하는 것은 템플릿 기반 클래스를 사용하는 것보다 더 많은 작업을 수행합니다.

비템플레이트 컬렉션을 사용하여 형식이 안전한 컬렉션을 만드는 방법에는 두 가지가 있습니다.

  1. 필요한 경우 형식 캐스팅과 함께 비템플레이트 컬렉션을 사용합니다. 이것이 더 쉬운 방법입니다.

  2. 비템플레이트 형식 안전 컬렉션에서 파생 및 확장합니다.

형식 캐스팅과 함께 비템플레이트 컬렉션을 사용하려면

  1. 비템플레이트 클래스(예: CWordArray직접)를 사용합니다.

    예를 들어 32비트 값을 만들고 CWordArray 추가한 다음 검색할 수 있습니다. 더 이상 할 일이 없습니다. 미리 정의된 기능만 사용합니다.

    미리 정의된 컬렉션(예: CObList)을 사용하여 파생된 CObject개체를 저장할 수도 있습니다. CObList 컬렉션은 포인터를 붙들도록 정의됩니다CObject. 목록에서 개체를 검색할 때 함수가 포인터를 반환하기 때문에 CObList 결과를 적절한 형식으로 캐스팅해야 할 CObject수 있습니다. 예를 들어 컬렉션에 개체를 CObList 저장하는 CPerson 경우 검색된 요소를 개체에 대한 포인터 CPerson 로 캐스팅해야 합니다. 다음 예제에서는 컬렉션을 사용하여 CObList 개체를 저장 CPerson 합니다.

    CPerson* p1 = new CPerson();
    CObList myList;
    
    myList.AddHead(p1);   // No cast needed
    CPerson* p2 = (CPerson*)myList.GetHead();
    

    미리 정의된 컬렉션 형식을 사용하고 필요에 따라 캐스팅하는 이 기술은 많은 컬렉션 요구 사항에 적합할 수 있습니다. 추가 기능 또는 더 많은 형식 안전성이 필요한 경우 템플릿 기반 클래스를 사용하거나 다음 절차를 따릅니다.

비템플레이트 형식 안전 컬렉션을 파생하고 확장하려면

  1. 미리 정의된 비템플레이트 클래스 중 하나에서 사용자 고유의 컬렉션 클래스를 파생합니다.

    클래스를 파생할 때 형식 안전 래퍼 함수를 추가하여 기존 함수에 형식 안전 인터페이스를 제공할 수 있습니다.

    예를 들어 개체를 보관 CPerson 하기 위해 목록을 CObList 파생한 경우 아래와 같이 래퍼 함수 및 GetHeadPerson래퍼 함수를 AddHeadPerson 추가할 수 있습니다.

    class CPersonList : public CObList
    {
    public:
       void AddHeadPerson(CPerson* person)
       {
          AddHead(person);
       }
    
       const CPerson* GetHeadPerson()
       {
          return (CPerson*)GetHead();
       }
    };
    

    이러한 래퍼 함수는 파생된 목록에서 개체를 추가하고 검색 CPerson 하는 형식 안전 방법을 제공합니다. 함수의 GetHeadPerson 경우 단순히 형식 캐스팅을 캡슐화하는 것을 볼 수 있습니다.

    형식 안전 래퍼에서 기존 기능을 래핑하는 대신 컬렉션의 기능을 확장하는 새 함수를 정의하여 새 기능을 추가할 수도 있습니다. 예를 들어 CObject 컬렉션의 모든 개체 삭제 문서에서는 목록에 포함된 모든 개체를 삭제하는 함수를 설명합니다. 이 함수는 파생 클래스에 멤버 함수로 추가할 수 있습니다.

참고 항목

컬렉션