Программирование >>  Структурное программирование 

1 ... 229 230 231 [ 232 ] 233 234 235 ... 342


FIG12 3.CPP

Тестовая программа, использующая шаблон класса Stack

iinclude <iostream. h> tinclude tstackl.h

main ( {

Stack<float> floatStack(5); float f = 1.1;

cout << Размещение элементов в floatStack << endl;

while (floatStack.push(f)) { в случае успеха возвращается 1

cout f ; f += 1.1;

cout << endl Стек заполнен. Невозможно разместить f endl endl

<< Выталкивание элементов из floatStack << endl;

while (floatStack.pop(f)) cout f ;

в случае успеха возвращается 1

cout << endl

<< Стек пуст. Больше ничего вытолкнуть невозможно endl;

Stack<int> intStack; int i = 1;

cout << endl Размещение элементов в intStack << endl;

while (intStack.push(i)) { cout i ; i += 1;

в случае успеха возвращается 1

cout << endl << Стек заполнен. Невозможно разместить << i endl

<< endl << Выталкивание элементов из intStack << endl;

while (intStack.pop(i)) cout i

в случае успеха возвращается 1

cout endl

Стек пуст. Больше ничего вытолкнуть невозможно endl; return 0;

Рис. 12.3. Программа драйвер шаблона класса Stack (часть 3 из 4)



Размещение элементов в floatStack Ч 1.1 2.2 3.3 4.4 5.5

X Стек эаполнен. Невозможно разместить 6.6

Выталкивание элементов из floatStack 5.5 4.4 3.3 2.2 1.1 Стек пуст. Больше ничего вытолкнуть невозможно

Размещение элементов в intStaclc 123456789 10

Стек заполнен. Невозможно разместить 11

Выталкивание элементов из intStack 10 987654321

Стек пуст. Больше ничего вытолкнуть невозможно

Рис. 12.3. Программа драйвер шаблона класса Stack (чааь 4 из 4)

Затем, программа создает стек целого типа intStack при помощи объявления

Stack<int> intStack;

(произносится это как intStack является объектом Stack элементов типа int ). Поскольку размер объекта не определен, используется значение размера по умолчанию, равное 10, как это определено в конструкторе с умолчанием. И опять в программе выполняются циклы помещения значений в intStack, пока он не заполнится, и выталкивания значений из intStack, пока он не станет пуст.

Каждое описания функции-элемента вне заголовка шаблона класса начинается с заголовка

template< class Т>

Описание каждой из этих функций походит на стандартное описание функции за исключением того, что тип элементов класса Stack всегда указывается имеющим тип Т. Чтобы связать каждое описание функции-элемента с областью действия шаблона класса, используется бинарная операция разрешения области действия с именем шаблона класса Stack<T>. В этом случае в качестве имени класса выступает Stack<Т>. Когда создается объект float-Stack типа Stack<float>, конструктор класса Stack создает массив элементов типа float, представляющий элементы данных стека. Оператор

stackPtr = new T[size];

В описании шаблона класса Stack замещается компилятором в шаблонном классе Stack<float> на оператор

StackPtr = new float[size];

Типичная ошибка программирования 12.5

В отличие от не шаблонных классов, которые могут быть вложенными, шаблоны классов не могут вкладываться друг в друга. Попытка вложить один шаблон класса внутрь другого приводит к синтаксической ошибке.



Замечание по технике программирования 12.4

Определение размера класса контейнера во время компиляции (например, через нетиповой параметр шаблона) исключает возможность возникновения потенциально неисправимой ошибки во время выполнения программы, если оператору new не удастся получить необходимое количество памяти.

В упражнениях вы встретите задание, в котором нужно будет использовать нетиповой параметр, облегчающий создание шаблона для класса Array, который мы разработали в главе 8, Перегрузка . Объекты класса Array, создаваемые на основе такого шаблона, получают необходимую память под свои элементы во время компиляции, вместо динамического выделения памяти во время выполнения программы.

Если для специфического типа данных нужен класс, который не соответствует общему шаблону класса, вы можете явно определить его, отменив тем самым действие шаблона для этого типа. Например, шаблон класса Array может использоваться для создания массивов любого типа. Однако, программист может взять управление на себя при создании класса Array для специфического типа, например, типа Martian. Для этого нужно просто создать новый класс с именем Array<Martian>.

12.5. Шаблоны классов и нетиповые параметры

Шаблон класса Stack, рассмотренный в предыдущем разделе, использовал только параметр типа в заголовке гпаблона. Но в шаблонах имеется возможность использования и так называемых нетиповых параметров. Например, заголовок нашего шаблона можно модифицировать следующим образом, указав в нем нетиповой параметр int elements:

template<class Т, int elements> нетиповой параметр

Тогда, объявление типа

Stack<float, 100> mostRecentSalesFigures;

приведет к созданию (во время компиляции) шаблонного класса Stack с именем mostRecentSalesFigures, состоящего из 100 элементов данных типа float; этот шаблонный класс будет иметь тип Stack<float, 100>. В описании класса в разделе закрытых данных-элементов можно поместить следующее объявление массива

Т stackHolder[elements]; массив для размещения данных стека

Совет по повышению эффективности 12.2

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



1 ... 229 230 231 [ 232 ] 233 234 235 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика