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


Практическое руководство. Создание типобезопасной коллекции

В этой статье описывается, как сделать типобезопасные коллекции для собственных типов данных.Ниже приведен список разделов.

  • Использование шаблон-основанные классы для безопасности типов

  • Реализация вспомогательной функции

  • Использование классов коллекции nontemplate

Библиотеки Microsoft Foundation Class предоставляет предопределенные типобезопасные коллекции на основании шаблонов C++.Поскольку эти шаблоны эти классы помогают обеспечить безопасность типов и простым в использовании без тип-отливки и другой дополнительную работу, участвующих в использовать класс nontemplate для этой цели.Пример COLLECT MFC демонстрирует использование шаблон-основанных классов коллекций в приложении MFC.В общем случае, используйте эти классы каждый раз при написании нового кода коллекций.

Использование Шаблон-Основанные классы для безопасности типов

Использовать шаблон-основал классы

  1. Объявите переменную типа класса коллекции.Примеры.

    CList<int, int> m_intList;
    
  2. Вызвать функции-члены объектов коллекции.Примеры.

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Если необходимо, реализуйте вспомогательные функции и SerializeElements.Дополнительные сведения о реализации этих функций см. в разделе Реализация вспомогательной функции.

В этом примере показано объявление списка целых чисел.Первый параметр в шаге 1 тип данных, хранящихся в качестве элементов списка.Второй параметр задает способ передачи данных и возвращать из функций-членов класса коллекции, например Добавить и GetAt.

Реализация вспомогательной функции

Шаблон-основанные классы CArray, CList и вспомогательной функции коллекций используют 5 CMap глобальные, которые можно настраивать как требуется для производного класса коллекции.Дополнительные сведения об этих функциях см. в разделе Вспомогательные объекты класса коллекции вспомогательные в справочнике по MFC.Реализация функции сериализации не требуется для большинства использует шаблон-основанных классов коллекций.

6s70zdb8.collapse_all(ru-ru,VS.110).gifВыполнить сериализацию элементов

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:

  1. Используйте коллекции nontemplate с отливкой типа, если это необходимо.Это более простой подход.

  2. Наследуется от и расширение коллекцию типобезопасного 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 описываются функции для удаления всех объектов, содержащихся в списке.Эта функция может быть добавлена к производному классу, что и функцию-член.

См. также

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

Коллекции