방법: 형식 안전 컬렉션을 확인 하십시오.
이 문서는 자신의 데이터 형식에 대해 형식 안전 컬렉션을 만드는 방법을 설명 합니다.다음 내용을 다룹니다.
형식 안정성을 위해 템플릿 기반 클래스를 사용합니다.
도우미 함수 구현
비템플릿 기반 컬렉션 클래스 사용
Mfc 라이브러리는 C++ 템플릿을 기반으로 하는 미리 정의 된 형식 안전 컬렉션을 제공 합니다.서식 파일이 있으므로 이러한 클래스 형식 안전성 및 형식 캐스팅 및 기타 비템플릿 기반 클래스를이 용도로 사용과 관련 된 추가 작업 없이 사용 용이성을 제공할 수 있습니다.MFC 샘플 수집 MFC 응용 프로그램에 템플릿 기반 컬렉션 클래스의 사용 방법을 보여 줍니다.일반적으로 새 컬렉션 코드를 작성할 언제 든 지 이러한 클래스를 사용 합니다.
형식 안정성을 위해 템플릿 기반 클래스를 사용합니다.
템플릿 기반 클래스를 사용 합니다.
컬렉션 클래스 형식의 변수를 선언 합니다.예를 들면 다음과 같습니다.
CList<int, int> m_intList;
함수의 컬렉션 개체의 멤버를 호출 합니다.예를 들면 다음과 같습니다.
m_intList.AddTail(100); m_intList.RemoveAll();
필요 하다 면 구현에서 도우미 함수 및 SerializeElements.이러한 기능을 구현에 대 한 내용은 을 구현 하는 도우미 함수.
정수 목록 선언 하는 예제입니다.1 단계의 첫째 매개 변수는 목록의 요소로 저장 된 데이터의 형식입니다.두 번째 매개 변수는 데이터를 전달 하 고 같은 컬렉션 클래스의 멤버 함수에서 반환 하는 방식을 지정 추가 및 GetAt.
도우미 함수 구현
템플릿 기반 컬렉션 클래스 CArray, CList, 및 CMap 파생된 컬렉션 클래스에 대 한 필요에 따라 사용자 지정할 수 있는 5 개의 글로벌 도우미 함수를 사용 합니다.이러한 도우미 함수에 대 한 자세한 내용은 컬렉션 클래스의 도우미 에 있는 MFC 참조.대부분의 템플릿 기반 컬렉션 클래스 사용에 대 한 serialization 함수 구현이 필요합니다.
요소를 serialize합니다.
CArray, CList, 및 CMap 클래스를 호출 SerializeElements 컬렉션의 요소를 저장 또는 보관 파일에서 읽을 수 있습니다.
기본 구현에서 SerializeElements 도우미 함수 비트 쓰기 개체를 보관 저장소에 없거나 연산을 아카이브에서 여부 개체에 저장 되는 따라 개체를 읽거나 보관 저장소에서 검색 합니다.재정의 SerializeElements 이 동작에 적합 하지 않은 경우.
컬렉션에서 파생 된 개체를 저장 하는 경우 CObject 사용은 IMPLEMENT_SERIAL 매크로 요소 컬렉션 클래스의 구현에 serialization 기능 내장에 걸릴 수 있습니다 CArchive 및 CObject:
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);
}
}
삽입을 오버 로드 된 연산자에 대 한 CArchive 호출 CObject::Serialize (또는 해당 함수를 재정의) 각 CPerson 개체입니다.
비템플릿 기반 컬렉션 클래스 사용
MFC에서는 MFC 버전 1.0에 도입 된 컬렉션 클래스를 지원 합니다.이러한 클래스 템플릿은 사용 하지 않습니다.지원 되는 형식의 데이터를 포함 하도록 사용할 수 있습니다 CObject*, UINT, DWORD, 및 CString.이러한 미리 정의 된 컬렉션을 사용할 수 있습니다 (같은 CObList)에서 파생 된 모든 개체의 컬렉션을 저장할 수 CObject.MFC에는 또한 기본 형식 같은 보유할 다른 미리 정의 된 컬렉션 제공 UINT 및 void 포인터 (void*).그러나 일반적으로, 개체 클래스와 그 파생물을 직접 형식 안전 컬렉션을 정의 하는 데 유용한 경우가 많습니다.비템플릿 기반 컬렉션 클래스를 그렇게 하지 템플릿 기반 클래스를 사용 하 여 보다 더 많은 작업입니다.
비템플릿 기반 컬렉션으로 형식 안전 컬렉션을 만드는 데는 두 가지 방법이 있습니다.
비템플릿 기반 컬렉션 형식이 필요한 경우을 사용 합니다.이 쉬운 방법입니다.
파생 하 고 비템플릿 기반 형식 안전 컬렉션을 확장 합니다.
형식 비템플릿 기반 컬렉션을 사용 하려면
비템플릿 기반 클래스 중 하나를 같은 사용 CWordArray, 직접.
예를 들어 만들 수 있습니다는 CWordArray 및 32 비트 값을 추가한 다음 검색할.방법은 더 이상 하지 마십시오입니다.단순히 미리 정의 된 기능을 사용 합니다.
또한 미리 정의 된 컬렉션에 같은 사용할 수 있습니다 CObList에서 파생 된 모든 개체를 보유 하 고 CObject.A CObList 컬렉션에 대 한 포인터를 보유할 정의 CObject.목록에서 개체를 검색할 때 결과 이후에 적절 한 형식으로 캐스팅 해야는 CObList 함수에 대 한 포인터를 반환 합니다. CObject.예를 들어, 사용자가 저장 하는 경우 CPerson 개체는 CObList 컬렉션에 있는 검색된 요소 수에 대 한 포인터를 캐스팅 하는 CPerson 개체.다음 예제는 CObList 보유 하는 컬렉션 CPerson 개체:
CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
이 기술을 미리 정의 된 컬렉션 형식을 사용 하 고 필요할 때 캐스팅의 다양 한 컬렉션 요구 사항에 적합할 수 있습니다.추가 기능이 나 좀더 강력한 형식 안정성이 필요한 경우 템플릿 기반 클래스를 사용 하거나 다음 절차를 따르십시오.
비템플릿 기반 형식 안전 컬렉션을 확장 하 고 파생
자신만 컬렉션 클래스는 미리 정의 된 비템플릿 기반 클래스 중 하나에서 파생 됩니다.
클래스를 파생 시킬 때 형식 안전 래퍼 함수를 기존 함수에 대 한 형식 안전 인터페이스를 제공할 수를 추가할 수 있습니다.
예를 들어, 목록에서 파생 된 경우 CObList 보유할 CPerson 개체를 래퍼 함수를 추가할 수 있습니다 AddHeadPerson 및 GetHeadPerson, 아래와 같이.
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
이러한 래퍼 함수를 추가 하 고 검색 하는 형식 안전 방법을 제공 CPerson 개체에서 파생 된 목록입니다.에 대 한 것을 볼 수 있는 GetHeadPerson 함수를 형식으로 캐스팅 하기만 하면 캡슐화 하는.
또한 형식 안전 래퍼에 기존 기능을 단지 배치 것이 아니라 컬렉션의 기능을 확장 하는 새 함수를 정의 하 여 새 기능을 추가할 수 있습니다.예를 들어, 문서 CObject 컬렉션의 모든 개체 삭제 목록에 포함 된 모든 개체를 삭제 하는 함수에 설명 합니다.이 함수는 파생 된 클래스에 멤버 함수로 추가할 수 있습니다.