Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
Шаблоны классовВ первую очередь наш итератор требуется связать со структурой, элементы которой он должен перебирать, что мы делаем при создании объекта класса 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 return mas + i; return 0; } Функция возвращает адрес найденного элемента или 0, если элемент с заданным значением не найден. Эту функцию можно использовать для поиска элементов в массиве любого типа, но использовать ее для списка нельзя, поэтому авторы STL ввели понятие итератора. Итератор более общее понятие, чем указатель. Тип iterator определен для всехконтейнерных классов STL, однако, реализация его в разных классах разная. Шаблоны классовК основным операциям, выполняемым с любыми итераторами, относятся:
Присваивание одного итератора другому. Сравнение итераторов на равенство и неравенство (== и !=). Перемещение его по всем элементам контейнера с помощью префиксного (++р) или постфиксного (р++) инкремента. Реализация итератора специфична для каждого класса, поэтому при объявлении всегда указывается область видимости: vector list ::iterator iter2; Шаблоны классовОрганизация циклов просмотра элементов контейнеров тоже имеет некоторую специфику. Вместо привычной формы for (i =0; i < n; ++i) используется следующая: for (i = first; i != last; ++i), где first - значение итератора, указывающее на первый элемент в контейнере, a last – значение итератора, указывающее на воображаемый элемент за последним элементом контейнера. Операция сравнения < заменена на операцию !=, т. к. операции < и > для итераторов в общем случае не поддерживаются. Для всех контейнерных классов определены унифицированные методы begin() и end(), возвращающие адреса first и last соответственно. Шаблоны классовПравила описания шаблонов:
шаблоны классов могут содержать статические элементы, дружественные функции и классы; шаблоны могут быть производными, как от шаблонов, так и от обычных классов, а также являться базовыми и для шаблонов, и для обычных классов. Шаблоны классовСпециализация Иногда возникает необходимость определить специализированную версию шаблона для какого-то конкретного типа его параметра (или одного из параметров). Рассмотрим отношение T a 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< } |