Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 245

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 239 240 241 242 243 244 < 245 > 246 247 248 249 250 251 .. 341 >> Следующая


sl.push(llll.lF): //занести 3 значения float, Sl.push(2222,2F); // вытолкнуть 3 значения float

si.pushC3333.3F): . 4

cout « "1: " « sl.popO « endl: cout « "2: " « sl.popO « endl: cout « "3: " « sl.popO « endl:

Stack<long> s2: //s2 - объект класса Stack<long>

s2.push(123123123L); //занести 3 long, вытолкнуть 3 long

s2. push (234234234L):

s2.push(345345345L):

cout « "1: " « s2.pop() « endl;

cout « "2: " « s2.pop() « endl;

cout « "3: " « s2.pop() « endl:

return 0; }

Здесь Stack является шаблонным классом. Идея шаблонных классов во многом сходна с идеей шаблонных функций. Ключевые слова template и class Stack говорят о том, что весь класс будет шаблонным.

template <class Туре>

class Stack {

//Данные и методы используют шаблонный аргумент Туре } ¦'

Шаблонный аргумент Туре используется вместо фиксированного типа во всех местах спецификации класса, где есть ссылка на тип массива st. Есть три таких места: определение st, тип аргумента функции push() и тип данных, возвращаемых функцией рор().

Шаблоны классов отличаются от шаблонов функций способом реализации. Для создания шаблонной функции мы вызываем ее с аргументами нужного типа. Классы же реализуются с помощью определения объекта, использующего шаблонный аргумент: Stack<float> si:

Такое выражение создаст объект si. Это стек, в котором хранятся числа типа float. Компилятор резервирует область памяти для данных этого объекта, используя тип float везде, где появляется аргумент Туре в спецификации класса. Резервируется место и под методы класса (если они не были помещены в память другим объектом типа Stack<float>). Конечно же, методы используют только тип float. На рис. 14.2 показано, как шаблоны классов и определения конкретных объектов приводят к занесению этих объектов в память. 650

Глава 14. Шаблоны и исключения

Создание объекта типа Stack, хранящего объекты каких-то других типов, как в выражении Stack<long> s2:

означает не только резервирование другого объема памяти для данных, но и создание нового набора методов, оперирующих типом long.

Имейте в виду, что имя типа si состоит из имени класса Stack и шаблонного аргумента-. Stack<float>. Это отличает его от других классов, которые могут быть созданы из того же шаблона (Stack<int> или Stack<long>).

Много объектов разных классов в памяти Рис. 14.2. Шаблон класса

В ТЕМPSTAK мы проверяем стеки si и s2, внося в них и выталкивая по три значения и выводя на экран все выталкиваемые значения. Вот результаты работы программы:

1: 3333.3//стек float

2: 2222.2

3: 1111.1

1: 345345345//стек long

2: 234234234

3: 123123123 Шаблоны классов 651

В этом примере мы «получаем два класса по цене одного». Для других типов данных можно создать свое множество объектов, и делается это всего одной строкой программы.

Контекстозависимое имя класса

В предыдущем примере все методы шаблона класса были определены внутри класса. Если методы определяются вне спецификации класса, нужно использовать новый синтаксис. Следующая программа показывает, как это можно сделать.

Листинг 14.4. Реализация стека в виде шаблона класса

// temstak2.cpp

// реализует стековый класс в виде шаблона // методы определяются вне класса !include <iostream> using namespace std: const int MAX - 100; ///////////////////////////////////////////////////////////// template «class Type>

class Stack {

private;

Type st[MAX]; //стек - массив любого типа

int top; //индекс вершины стека

public;

StackO; //конструктор

void push(Type var); //занести число в стек

Туре рорО; //взять число из стека

}:

///////////////////////////////////////////////////////////// tempiate<class Туре>

Stack<Type>: ;StackO //конструктор {

top - -1:

}

//...........................................................

tempiate<class Type>

void Stack<Type>;;push(Type var) //положить число в стек {

st[++top] = var;

}

//...........................................................

tempiate<class Type>

Type Stack<Type>::popO //взять число из стека

{

return StCtop--]; }

//...........................................................

int mainO {

Stack<float> si; //si - обьект класса Stack<float>

sl.push(llll.lF); //занести 3 float, вытолкнуть 3 float

продолжение ?> 652

Глава 14. Шаблоны и исключения

Листинг 14.4 (продолжение)

sl.pushC2222.2F): Sl.pushC 3333.3F):

COut « "1: " « Sl.popO « endl; cout « "2: " « sl.popO « endl; cout « "3: " « sl.popO « endl:

Stack<long> s2: //s2 - обьект класса Stack<long>

s2.push(123123123L): //занести 3 long, вытолкнуть 3 long

s2.push(234234234L);

s2. push(345345345L);

cout « "1: " « s2.pop() « endl:

cout « "2: " « s2.pop() « endl;

cout « "3: " « s2.pop() « endl:

return 0; }

Выражение template<class Type> должно предварять не только определение класса, но и каждый определенный вне класса метод. Вот как выглядит функция push():

templates!ass Туре> void Stack<Type>::push(Type var) (
Предыдущая << 1 .. 239 240 241 242 243 244 < 245 > 246 247 248 249 250 251 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100