Практическое руководство. Создание типобезопасной коллекции
В этой статье описывается, как сделать типобезопасные коллекции для собственных типов данных.Ниже приведен список разделов.
Использование шаблон-основанные классы для безопасности типов
Реализация вспомогательной функции
Использование классов коллекции nontemplate
Библиотеки Microsoft Foundation Class предоставляет предопределенные типобезопасные коллекции на основании шаблонов C++.Поскольку эти шаблоны эти классы помогают обеспечить безопасность типов и простым в использовании без тип-отливки и другой дополнительную работу, участвующих в использовать класс nontemplate для этой цели.Пример COLLECT MFC демонстрирует использование шаблон-основанных классов коллекций в приложении MFC.В общем случае, используйте эти классы каждый раз при написании нового кода коллекций.
Использование Шаблон-Основанные классы для безопасности типов
Использовать шаблон-основал классы
Объявите переменную типа класса коллекции.Примеры.
CList<int, int> m_intList;
Вызвать функции-члены объектов коллекции.Примеры.
m_intList.AddTail(100); m_intList.RemoveAll();
Если необходимо, реализуйте вспомогательные функции и SerializeElements.Дополнительные сведения о реализации этих функций см. в разделе Реализация вспомогательной функции.
В этом примере показано объявление списка целых чисел.Первый параметр в шаге 1 тип данных, хранящихся в качестве элементов списка.Второй параметр задает способ передачи данных и возвращать из функций-членов класса коллекции, например Добавить и GetAt.
Реализация вспомогательной функции
Шаблон-основанные классы CArray, CList и вспомогательной функции коллекций используют 5 CMap глобальные, которые можно настраивать как требуется для производного класса коллекции.Дополнительные сведения об этих функциях см. в разделе Вспомогательные объекты класса коллекции вспомогательные в справочнике по MFC.Реализация функции сериализации не требуется для большинства использует шаблон-основанных классов коллекций.
Выполнить сериализацию элементов
CArray, CList и классы CMap вызывают SerializeElements для хранения элементов в коллекции или считывания их из архива.
Реализация по умолчанию вспомогательные функции SerializeElements выполняет битовую запись из объектов в архив или побитовое прочитанному из архива к объектам, в зависимости от того, хранятся ли объекты или извлечь из архива.Переопределите SerializeElements если это действие не подходит.
Если коллекция содержит объекты, производные от CObject и используется макрос IMPLEMENT_SERIAL в реализации класса элемента коллекции, то можно воспользоваться преимуществами функциональности сериализации, созданной в 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.
Использование классов коллекции Nontemplate
MFC поддерживает также классы коллекций, вставленные с версией MFC 1.0.Эти классы не основываются на шаблонах.Их можно использовать для хранения данных, поддерживаемых типов CObject*, uint, DWORD и CString.Можно использовать эти предопределенные коллекции (например CObList), чтобы хранить коллекции всех объектов, производных от CObject.MFC предоставляет также другие стандартные коллекции для хранения типы-примитивы, как uint и пустых указателей (void*).Как правило, однако часто полезно задать собственные типобезопасные коллекции для хранения объектов более конкретного класса и его производных.Обратите внимание, что это приведет с классы коллекций не на основе шаблонов больше работы, чем использование шаблон-основанные классы.
2 Способа создания типобезопасных коллекции с коллекциями nontemplate:
Используйте коллекции nontemplate с отливкой типа, если это необходимо.Это более простой подход.
Наследуется от и расширение коллекцию типобезопасного nontemplate.
Использование коллекции nontemplate с отливкой типа
Воспользуйтесь одним из классов nontemplate, как CWordArray, напрямую.
Например, можно создать CWordArray и добавить в него все 32 значений, а затем получить их.Больше ничего делать.Просто использовать стандартную функциональность.
Можно также использовать предопределенную коллекцию, например CObList, чтобы оставить все объекты, извлеченные из CObject.Коллекция 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();
Этому методу использовать предопределенный тип коллекции и приведение по мере необходимости может быть адекватнь для многих из коллекции.Если требуется провести более дальнеишая функциональные возможности или несколько безопасности типов, то используйте шаблон-основанный класс или после следующей процедуре.
Наследовать и расширять коллекцию типобезопасного nontemplate
Создайте собственный класс коллекции из одной из предопределенных классов nontemplate.
При наследовании класса можно добавить типобезопасные функция-оболочки для реализации типобезопасный интерфейс существующие функции.
Например, если производные список из CObList для хранения объектов CPerson, то можно добавить функция-оболочки AddHeadPerson и GetHeadPerson, как показано ниже.
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
Эти функция-оболочки предоставляют типобезопасный способ добавлять и извлекать объекты CPerson, производного от списка.Можно увидеть, что для функции GetHeadPerson просто инкапсулируете приведение типов.
Можно также добавить новую функциональность путем указания новых функций, расширяющих возможности коллекции, а не просто создающ программу-оболочку существующую функциональность в программах-оболочках типобезопасных.Например, статьи Удалить все объекты в коллекции CObject описываются функции для удаления всех объектов, содержащихся в списке.Эта функция может быть добавлена к производному классу, что и функцию-член.