- •Мальшаков г.В. Www.Malshakov.Ru Лабораторная работа №13. "Шаблоны классов"
- •1. Краткие теоретические сведения
- •Определение шаблона класса
- •Void Show() const{
- •Void Show() const;
- •Использование шаблона класса
- •Организация исходного кода
- •Void Show() const;
- •Int main(){
- •Параметры шаблонов
- •Тогда, объявив объект
- •Int main() {
- •Специализация
- •Int main() {
- •Void OutSelect() const {
- •Int main() {
- •2. Стандартные программные решения
- •Int mu::extend() {
- •Int zlist::size() {
- •Int n; zlist *p;
- •Void *zlist::remove( void *pd){
- •Void *zlist::min(){
- •Void main(){
- •Int btree::size() {
- •Void *btree::operator[](void *key){
- •Void * btree::operator[](int &n) {
- •Void *q;
- •Void btree::operator()(void* pnew){
- •3. Постановка задачи
- •4. Варианты заданий
- •5. Содержание отчета
- •6. Список литературы
Мальшаков г.В. Www.Malshakov.Ru Лабораторная работа №13. "Шаблоны классов"
Цель: Получить практические навыки по использованию шаблонов классов языка С++.
1. Краткие теоретические сведения
Шаблоны. В Си++ имеются средства, позволяющие определить некоторое множество идентичных классов с параметризованным типом внутренних элементов. Они представляют собой заготовку класса (шаблон), в которой в виде параметра задан тип (класс) входящих в него внутренних элементов. При создании конкретного объекта необходимо дополнительно указать и конкретный тип внутренних элементов в качестве фактического параметра. Создание объекта сопровождается формальной генерацией соответствующего класса для типа, заданного в виде параметра. Принятый в Си++ способ определения множества классов с параметризованным внутренним типом данных (иначе - макроопределение) называется шаблоном (template).
Шаблон - макроопределение (текстовая заготовка) класса с параметром - типом данных.
Определение шаблона класса
Определение шаблонного (обобщенного, родового) класса имеет вид:
template <параметры_шаблона>classимя_класса{/* ... */};
Например, определение шаблонного класса Point будет выглядеть следующим образом:
template <параметры_шаблона>classимя_класса{/* ...*/ };
template <class T> class Point {
public:
Point (T _x = 0, T _y = 0) : x(_x), y(_y){}
Void Show() const{
cout << "(" << x << ", " << y << ")" << endl;
};
private: T x, y;
};
Вы заметили, чем отличается это определение от определения обычного класса? Префикс template <class T> указывает, что объявлен шаблон класса, в котором Т — некоторый абстрактный тип. То есть ключевое слово class в этом контексте задает вовсе не класс, а означает лишь то, что Т — это параметр шаблона. Вместо Т может использоваться любое имя. После объявления Т используется внутри шаблона точно так же, как имена других типов. Отметим, что язык позволяет вместо ключевого слова class перед параметром шаблона использовать другое ключевое слово — typename, то есть написать:
template < typename T> class Point { /* ... */};
В литературе встречаются оба стиля объявления, но первый, пожалуй, более распространен.
Определение встроенных методов внутри шаблона класса практически не отличается от записи в обычном классе. Но если определение метода выносится за пределы класса, то синтаксис его заголовка усложняется. Покажем это на примере метода Show():
// Версия с внешним определением метода Show()
template <class T> class Point {
public:
Point(T _x = 0, T _y = 0) : x(_x), y(_y) {}
Void Show() const;
private:
T x, y;
};
template <class T> void Point<T> :: Show() const {
cout << " (" << x << ", " << y << ")" << endl;
}
Обратите внимание на появление того же префикса template <class T>, который предварял объявление шаблона класса, а также на более сложную запись операции квалификации области видимости для имени Show(): если раньше мы писали Point::, то теперь пишем Point<T>::, добавляя к имени класса список параметров шаблона, заключенный в угловые скобки (в данном случае один параметр Т).