Поделиться через


Классы на основе шаблонов

В этой статье описывается типобезопасные классы коллекций команды, в MFC версии 3.0 и более поздних версиях. С помощью этих шаблонов создание типобезопасные коллекции более понятны и справки обеспечивают безопасность типов более эффективно, чем использование классов коллекций не на основе шаблонов.

MFC предопределяет 2 категории коллекций команды на:

  • Простые массивы, списки, сопоставления и классы

    CArray, CList, CMap

  • Массивы, списки и сопоставления типизированных указателей

    CTypedPtrArray, CTypedPtrList, CTypedPtrMap

Простые классы коллекций все являются производными от класса CObject, поэтому они наследует сериализацию, динамическое создание и других свойств CObject. Типизированные классы коллекций указателя требуется определить класс необходимо наследовать от —, которые должны быть одной из коллекций указателя nontemplate предопределенных MFC, например CPtrList или CPtrArray. Новый класс коллекции наследуется от определенного базового класса и вызова функции-члены класса инкапсулированных использованием для обращения к членам базового класса, чтобы обеспечить безопасность типов.

Шаблоны C++ Дополнительные сведения о см. в разделе Шаблоны в справочнике по языку C C++.

Использование простых массивы, списки, сопоставления и шаблоны

Для использования простых шаблонов коллекции необходимо знать, какие типы данных можно магазин в этих коллекциях, и параметры, которые будут использоваться в ваших объявлениях коллекции.

Простое потребление массива и списка

Простые массив и классы списка CArray и CList, занимают 2 параметра: ТИП и ARG_TYPE. Эти классы могут хранить любого типа данных, указанных в параметре типа.

  • Основные типы данных C++, например int, char и плавающее

  • Структуры и классы C++.

  • Другие типы, определяемые

Для удобства и эффективности можно использовать параметр ARG_TYPE определить тип аргументов функции. Обычно указывается ARG_TYPE как ссылка на тип, заданное в параметре типа. Примеры.

CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;

В первом примере объявляется коллекцию массива, myArray, которая содержит int s. Во втором примере объявляется коллекцию списка, myList, которая сохраняет объекты CPerson. Некоторые функции членов классов коллекций принимают аргументы, тип которых указан параметр шаблона ARG_TYPE. Например, функцию-член Добавить класса CArray принимает аргумент ARG_TYPE:

CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);

Простое потребление сопоставления

Простой класс сопоставления, CMap принимает 4 параметра: КЛЮЧ, ARG_KEY, VALUE и ARG_VALUE. Как массив и классы списка, классы сопоставления могут хранить любого типа данных. В отличие от, списки, массивы и индекс и упорядочить данные, они хранят сопоставления связывают ключей и значений. Для получения значения, который хранит в сопоставлении связанный с указанием значения ключа. Определяющий параметр задает тип данных ключей, используемых для доступа к данным, хранящимся в сопоставлении. Если тип КЛЮЧА структуры или класса, параметр ARG_KEY обычно ссылка на тип, определенный в КЛЮЧЕ. Параметр VALUE определяет тип элемента, хранящегося в сопоставлении. Если тип ARG_VALUE структуры или класса, параметр ARG_VALUE обычно ссылка на тип, определенный в VALUE. Примеры.

CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;

В первом примере хранит значения MY_STRUCT, доступ к ним ключам int и возвращает открывавшиеся элементы MY_STRUCT по ссылке. Во втором примере хранит значения CPerson, доступ к ним ключам CString и возвращает ссылки на осуществлять доступ к элементам. Этот пример может быть представлен простой адресной книги, в которой необходимо найти людей вверх по фамилии.

Поскольку определяющий параметр типа CString и параметр KEY_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 и <TYPE2>. Эти классы могут хранить любого типа данных, указанных в параметре типа. Они являются производными от одного из классов коллекций, nontemplate хранятся указатели; необходимо указать этот базовый класс в BASE_CLASS. Для массивов используйте или CObArray или CPtrArray. Для списков используйте или CObList или CPtrList.

В результате при объявлении коллекцию, основанной на, предположим 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, КЛЮЧ и VALUE. Параметр BASE_CLASS определяет класс, от которого создать новый класс. CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb и т д КЛЮЧ аналогичн в КЛЮЧУ в CMap: Он определяет тип ключа, используемого для поиска. VALUE является аналогом VALUE в CMap: Он определяет тип объекта, хранящиеся в сопоставлении. Примеры.

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

В первом примере сопоставление на основе CMapPtrToPt r — он использует ключи CString сопоставленных с указателями на MY_STRUCT. Можно производить поиск, сохраняют указатель, вызвав функцию-член типобезопасный Lookup. Можно использовать оператор [ ] уточнять, сохраняют указатель и добавление его, если не найден. Можно просмотреть и сопоставление с помощью типобезопасную функции GetNextAssoc. Можно также вызвать другие функции-члены класса CMapPtrToPtr.

Во втором примере сопоставление на основе CMapStringToO B — он использует ключи строки " сопоставление, который хранят указателям на объекты CMyObject. Можно использовать те же типобезопасные члены, описанных в предыдущем абзаце, или можно вызывать члены класса CMapStringToOb.

Примечание

Если указать тип класс или struct для параметра VALUE, а не указатель или ссылку на тип, класс или структура должны иметь конструктор копий.

Дополнительные сведения см. в разделе Создание типобезопасную коллекцию.

См. также

Основные понятия

Коллекции