Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12пми / Template / namefix / ЛР13.doc
Скачиваний:
22
Добавлен:
02.06.2015
Размер:
147.46 Кб
Скачать

Мальшаков г.В. 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>::, добавляя к имени класса список параметров шаблона, заключенный в угловые скобки (в данном случае один параметр Т).

Соседние файлы в папке namefix