Шаблон- на основе классов
В этой статье описывается типобезопасные шаблон-основанные классы коллекций MFC в версии 3.0 и более поздних версий.С помощью этих шаблонов создания типобезопасных коллекции более удобно и обеспечивают безопасность типа более эффективно, чем использование классов коллекций не на основе шаблонов.
2 Шаблон-основанных коллекций MFC предопределяет категории:
Простые массив, список и классы сопоставления
CArray, CList, CMap
Массивы, списки и сопоставления типизированных указателей
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
Все коллекции простых классы наследуются от класса CObject, поэтому они наследует сериализацию, динамическое создание и другие свойства CObject.Типизированные классы коллекций, указателя требуется определить класс наследуется от —, должно быть одной из предопределенных коллекций, указателя nontemplate MFC, как CPtrList или CPtrArray.Новый класс наследует из коллекции указанного базового класса и вызовов функций элементов нового типа, инкапсулированных в использованием к членам базового класса для обеспечения безопасности типа.
Дополнительные сведения о шаблонах C++ см. в разделе Шаблоны в справочнике по языку C++.
Использование простых массив, список и шаблоны сопоставления
Для использования простых шаблонов коллекции необходимо знать, какие данные могут храниться в этих коллекциях, и какие параметры, которые следует использовать в объявлениях коллекции.
Простое потребление массива и списка
Простые классы массива и списка CArray и CList, принимающие 2 параметра: ТИП и ARG_TYPE.Эти классы могут содержать любой тип данных, который можно указать в параметре типа.
Базовые типы данных int C++, например, char и float
Структуры и классы C++
Другие типы, которые определяются
Для удобства и эффективности, можно использовать параметр ARG_TYPE для указания типа аргументов функции.Обычно указывается ARG_TYPE как ссылка на тип, с именем в параметре типа.Примеры.
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
В первом примере объявляется коллекцию массива, myArray, которая содержит int.Во втором примере объявляется коллекцию списков, myList, которая хранит объекты CPerson.Некоторые функции-члены классов коллекций принимают аргументы тип которых определен параметром шаблона ARG_TYPE.Например, функция-член Добавить класса CArray принимает аргумент ARG_TYPE:
CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);
Простое потребление сопоставления
Простой класс сопоставления, CMap, принимает 4 параметров. КЛАВИША, ARG_KEY, ЗНАЧЕНИЕ и ARG_VALUE.Например, классы массива и списка классы сопоставления могут хранить данные любого типа.В отличие от массивы и списки, которым данные хранятся индекс и упорядочивает их, связывать сопоставлений клавиш и значения. Обращении к значению, хранящихся в сопоставлении с помощью клавиши значения, связанную.Указывает тип данных параметра ключа клавиш, используемых для доступа к данным, хранящимся в сопоставлении.Если тип КЛАВИШИ структура или класс, то параметр ARG_KEY обычно ссылка на тип, указанный в КЛАВИШЕ.Параметр ЗНАЧЕНИЯ, указывающее тип элементов, хранящихся в сопоставлении.Если тип ARG_VALUE структура или класс, то параметр ARG_VALUE обычно ссылка на тип, указанный в ЗНАЧЕНИИ.Примеры.
CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;
В первом примере хранит значения MY_STRUCT, обращающийся к ним клавишами int и возвращает элементы, к которым обращаются MY_STRUCT по ссылке.Во втором примере хранит значения CPerson, обращающийся к ним клавишами CString и возвращает ссылки на элементы, к которым.Этот пример может представлять простой адресную книгу, в которой ищется persons фамилии.
Поскольку параметра ключа и параметр типа CStringKEY_TYPE типа LPCSTR, клавиш хранятся в сопоставлении как элементы типа CString но имеются ссылки в функциях, как SetAt через указатели типа LPCSTR.Примеры.
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Использование шаблонов коллекции Печатать-Указателя
Для использования шаблонов коллекции печатать-указателя необходимо знать, какие типы данных можно хранить в этих коллекциях, и какие параметры, которые следует использовать в объявлениях коллекции.
Массив Печатать-Указателя и потребление списка
Классы массива и списка печатать-указателя, CTypedPtrArray и CTypedPtrList, принимающие 2 параметра: BASE_CLASS и ТИП.Эти классы могут содержать любой тип данных, который можно указать в параметре типа.Они являются производными от одного из классов коллекций nontemplate, в котором хранятся указатели. этот базовый класс указывается в BASE_CLASS.Для массивов, используйте CObArray или CPtrArray.Для списков, используйте CObList или CPtrList.
В результате при объявлении коллекцию based on, скажите CObList, новый класс наследует не только члены базового класса, но также объявляет несколько дополнительных типобезопасных функций-членов и операторов, что обеспечивает безопасность типов справка, инкапсулируя вызовы членам базового класса.Эти инкапсуляции управляют все необходимое преобразование типа.Примеры.
CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;
В первом примере объявляется массив печатать-указателя, myArray, который является производным от CObArray.Хранит и возвращает массив указателей на объекты CPerson (где CPerson класс, производный от CObject).Можно вызвать любой функции-члена CObArray или вызов типобезопасных GetAt новые функции и ElementAt или использовать оператор [ типобезопасный ].
Во втором примере объявляется список печатать-указателя, myList, который является производным от CPtrList.Список хранит и возвращает указатели на объекты MY_STRUCT.Класс на основе CPtrList используется для хранения указателей на объекты не производным от CObject.CTypedPtrList имеет несколько типобезопасных функции-члены: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev и GetAt.
Потребление сопоставления Печатать-Указателя
Класс сопоставления печатать-указателя, CTypedPtrMap, принимает 3 параметров. BASE_CLASS, КЛАВИША и ЗНАЧЕНИЕ.Параметр BASE_CLASS определяет класс, из которого формируются данные новый класс. CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb и т дКЛАВИША аналогична чтобы ПОЛЬЗОВАТЬСЯ КЛЮЧОМ в CMap: Она определяет тип клавиш, используемой для уточняющих запросов.ЗНАЧЕНИЕ аналогично ЗНАЧЕНИЮCMap: Он определяет тип объекта, хранимого в сопоставлении.Примеры.
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
В первом примере сопоставление на основе CMapPtrToPt r — его с помощью клавиш CString, сопоставленные с указателям на MY_STRUCT.Можно поиска, который хранится указатель, вызвав функцию-член Lookup типобезопасному.Можно использовать оператор [] для поиска, который хранится указатель и добавление его, если объект не найден.Сопоставление и можно просматривать с помощью типобезопасную функцию GetNextAssoc.Можно также вызвать другие функции-члены класса CMapPtrToPtr.
Во втором примере сопоставление на основе CMapStringToO б — его с помощью клавиш строки, сопоставленные к хранимому указатели на объекты CMyObject.Можно использовать те же типобезопасные элементы, описанные в предыдущем абзаце или можно вызвать члены класса CMapStringToOb.
Примечание |
---|
Если указывается тип класс или struct для параметра ЗНАЧЕНИЯ, то вместо указателя или ссылка на тип, класс или структура должны иметь конструктор копии. |
Дополнительные сведения см. в разделе Как сделать типобезопасную коллекцию.