Главная страница
Навигация по странице:

  • Шаблоны классов

  • //специализация для char* template class Sample { bool Less(T) const; ... }; Шаблоны классов

  • Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы


    Скачать 1.76 Mb.
    НазваниеОбъекты и классы
    АнкорКурс ООП в С презентация
    Дата21.02.2022
    Размер1.76 Mb.
    Формат файлаppt
    Имя файлаООП в с++(полный курс).ppt
    ТипДокументы
    #368655
    страница15 из 26
    1   ...   11   12   13   14   15   16   17   18   ...   26

    Шаблоны классов


    В первую очередь наш итератор требуется связать со структурой, элементы которой он должен перебирать, что мы делаем при создании объекта класса group_iterator, и связать его с элементом последовательности. Для этого мы инициализируем атрибут-ссылку G и атрибут current, хранящий адрес указателя на объект, описывающий элемент последовательности – структуру типа node.
    Поясним, почему нам потребовалось вводить current как "указатель на указатель". Дело в том, что, создавая объект-итератор, мы связываем его с первым элементом последовательности, адрес которого хранится в атрибуте first объекта-группы. Если последовательность ещё не содержит элементов, то значение first будет нулевым, до тех пор, пока элемент не будет добавлен. Создав атрибут current как копию first, а не как его адрес (который остаётся неизменным), мы бы остались в неведении относительно фактического значения указателя на первый элемент списка, изменяющегося в случае добавления или удаления данного элемента. В нашем же случае значения получаются путем выполнения операции разыменования.

    Шаблоны классов


    Рассмотрим, как можно реализовать шаблон функции для поиска элементов в массиве, который хранит объекты типа Data:
    template
    Data* Find(Data*mas, int n, const Data& key)
    {
    for(int i=0;i if (*(mas + i) == key)
    return mas + i;
    return 0;
    }
    Функция возвращает адрес найденного элемента или 0, если элемент с заданным значением не найден.
    Эту функцию можно использовать для поиска элементов в массиве любого типа, но использовать ее для списка нельзя, поэтому авторы STL ввели понятие итератора. Итератор более общее понятие, чем указатель. Тип iterator определен для всехконтейнерных классов STL, однако, реализация его в разных классах разная.

    Шаблоны классов


    К основным операциям, выполняемым с любыми итераторами, относятся:
      Разыменование итератора: если р – итератор, то *р – значение объекта, на ко­торый он ссылается.
      Присваивание одного итератора другому.
      Сравнение итераторов на равенство и неравенство (== и !=).
      Перемещение его по всем элементам контейнера с помощью префиксного (++р) или постфиксного (р++) инкремента.

      Реализация итератора специфична для каждого класса, поэтому при объявлении всегда указывается область видимости:

      vector::iterator iterl;
      list
      ::iterator iter2;

    Шаблоны классов


    Организация циклов просмотра элементов контейнеров тоже имеет некоторую специфику. Вместо привычной формы
    for (i =0; i < n; ++i) используется следующая:
    for (i = first; i != last; ++i), где first - значение итератора, указывающее на первый элемент в контейнере, a last – значение итератора, указывающее на воображаемый элемент за последним элементом контейнера.
    Операция сравнения < заменена на операцию !=, т. к. операции < и > для итераторов в общем случае не поддерживаются.
    Для всех контейнерных классов определены унифицированные методы begin() и end(), возвращающие адреса first и last соответственно.

    Шаблоны классов


    Правила описания шаблонов:
      шаблоны методов (функций) не могут быть виртуальными;
      шаблоны классов могут содержать статические элементы, дружественные функции и классы;
      шаблоны могут быть производными, как от шаблонов, так и от обычных классов, а также являться базовыми и для шаблонов, и для обычных классов.

    Шаблоны классов


    Специализация
    Иногда возникает необходимость определить специализированную версию шаблона для какого-то конкретного типа его параметра (или одного из параметров).
    Рассмотрим отношение T a template
    class Sample
    {
    bool Less(T) const;
    ...
    };
    //специализация для char*
    template < >
    class Sample
    {
    bool Less(T) const;
    ...
    };

    Шаблоны классов


    Использование классов функциональных объектов для настройки
    шаблонных классов
    Функциональным объектом называется объект, для которого перегружена операция вызова функции operator(). Класс, экземпляром которого является этот объект, называется функциональным классом. В таком классе не нужны другие поля и методы. Использование такого класса имеет специфический синтаксис.
    struct LessThan
    {
    bool operator()(const int x, const int y)
    {
    return x }
    };
    int main()
    {
    LessThan x; //объект функционального класса
    int a = 5,b = 10;
    if( x(a,b)) cout< }

    1   ...   11   12   13   14   15   16   17   18   ...   26


    написать администратору сайта