ВУЗ:
Составители:
Рубрика:
24
ва и показывается на двух небольших демонстрационных программах, как им пользо-
ваться.
Одним из самых полезных видов классов является контейнерный класс, т.е. та-
кой класс, который хранит объекты каких-то других типов. Списки, массивы, ассоциа-
тивные массивы и множества - все это контейнерные классы. Но контейнерные классы
обладают тем интересным
свойством, что тип содержащихся в них объектов не имеет
особого значения для создателя контейнера, но для пользователя конкретного контей-
нера этот тип является существенным. Следовательно, тип содержащихся объектов
должен параметром контейнерного класса, и создатель такого класса будет определять
его с помощью типа-параметра. Для каждого конкретного контейнера (т.е. объекта кон
-
тейнерного класса) пользователь будет указывать каким должен быть тип содержащих-
ся в нем объектов.
Использование шаблонных классов означает наличие шаблонных функций-
членов. Помимо этого, можно определить глобальные шаблонные функции, т.е. шабло-
ны типа для функций, не являющихся членами класса. Шаблон типа для функций по-
рождает семейство функций точно также,
как шаблон типа для класса порождает се-
мейство классов. Эту возможность мы обсудим на последовательности примеров, в ко-
торых приводятся варианты функции сортировки sort(). Каждый из вариантов в после-
дующих разделах будет иллюстрировать общий метод. Как обычно мы сосредоточим-
ся на организации программы, а не на разработке ее алгоритма, поэтому использоваться
будет
тривиальный алгоритм. Все варианты шаблона типа для sort() нужны для того,
чтобы показать возможности языка м полезные приемы программирования. Варианты
не упорядочены в соответствии с тем, насколько они хороши. Кроме того, можно об-
судить и традиционные варианты без шаблонов типа, в частности, передачу указателя
на функцию, производящую сравнение.
Введение операций с помощью параметров шаблонного класса.
Возможны ситуации, когда неявность связи между шаблонной функцией sort() и
шаблонным классом Comparator создает трудности. Неявную связь легко упустить из
виду и в то же время разобраться в ней может быть непросто. Кроме того, поскольку
эта связь "встроена" в функцию sort(), невозможно использовать эту функцию для сор-
тировки векторов одного типа, если операция
сравнения рассчитана на другой тип. По-
местив функцию sort()в класс, мы можем явно задавать связь с классом Comparator:
template class Sort {
public:
static void sort(Vector&);
};
Не хочется повторять тип элемента, и это можно не делать, если использовать
typedef в шаблоне Comparator:
template class Comparator {
public:
typedef T T; // определение Comparator::T
static int lessthan(T& a, T& b) {
return a < b;
}
// ...
24 ва и показывается на двух небольших демонстрационных программах, как им пользо- ваться. Одним из самых полезных видов классов является контейнерный класс, т.е. та- кой класс, который хранит объекты каких-то других типов. Списки, массивы, ассоциа- тивные массивы и множества - все это контейнерные классы. Но контейнерные классы обладают тем интересным свойством, что тип содержащихся в них объектов не имеет особого значения для создателя контейнера, но для пользователя конкретного контей- нера этот тип является существенным. Следовательно, тип содержащихся объектов должен параметром контейнерного класса, и создатель такого класса будет определять его с помощью типа-параметра. Для каждого конкретного контейнера (т.е. объекта кон- тейнерного класса) пользователь будет указывать каким должен быть тип содержащих- ся в нем объектов. Использование шаблонных классов означает наличие шаблонных функций- членов. Помимо этого, можно определить глобальные шаблонные функции, т.е. шабло- ны типа для функций, не являющихся членами класса. Шаблон типа для функций по- рождает семейство функций точно также, как шаблон типа для класса порождает се- мейство классов. Эту возможность мы обсудим на последовательности примеров, в ко- торых приводятся варианты функции сортировки sort(). Каждый из вариантов в после- дующих разделах будет иллюстрировать общий метод. Как обычно мы сосредоточим- ся на организации программы, а не на разработке ее алгоритма, поэтому использоваться будет тривиальный алгоритм. Все варианты шаблона типа для sort() нужны для того, чтобы показать возможности языка м полезные приемы программирования. Варианты не упорядочены в соответствии с тем, насколько они хороши. Кроме того, можно об- судить и традиционные варианты без шаблонов типа, в частности, передачу указателя на функцию, производящую сравнение. Введение операций с помощью параметров шаблонного класса. Возможны ситуации, когда неявность связи между шаблонной функцией sort() и шаблонным классом Comparator создает трудности. Неявную связь легко упустить из виду и в то же время разобраться в ней может быть непросто. Кроме того, поскольку эта связь "встроена" в функцию sort(), невозможно использовать эту функцию для сор- тировки векторов одного типа, если операция сравнения рассчитана на другой тип. По- местив функцию sort()в класс, мы можем явно задавать связь с классом Comparator: template class Sort { public: static void sort(Vector&); }; Не хочется повторять тип элемента, и это можно не делать, если использовать typedef в шаблоне Comparator: template class Comparator { public: typedef T T; // определение Comparator::T static int lessthan(T& a, T& b) { return a < b; } // ...
Страницы
- « первая
- ‹ предыдущая
- …
- 22
- 23
- 24
- 25
- 26
- …
- следующая ›
- последняя »