Выбрать главу

template class Type

Type min( Type a, Type b ) {

return a b ? a : b;

}

swap() – шаблон функции для перестановки двух элементов массива любого типа:

template class elemType

void swap( ArrayelemType array, int i, int j )

{

elemType tmp = array[ i ];

array[ i ] = array[ j ];

array[ j ] = tmp;

}

Убедиться в том, что функция sort() действительно работает, можно с помощью отображения содержимого массива после сортировки. Поскольку функция display() должна обрабатывать любой массив, конкретизированный из шаблона класса Array, ее тоже следует определить как шаблон:

#include iostream

template class elemType

void display( ArrayelemType array )

{ //формат отображения: 0 1 2 3 4 5

cout " ";

for ( int ix = 0; ix array.size(); ++ix )

cout array[ix] " ";

cout "\n";

}

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

Следующий шаг – написание функции для тестирования этих шаблонов. В sort() поочередно передаются массивы элементов типа double, типа int и массив строк. Вот текст программы:

#include iostream

#include string

#include "Array.h"

double da[10] = {

26.7, 5.7, 37.7, 1.7, 61.7, 11.7, 59.7,

15.7, 48.7, 19.7 };

int ia[16] = {

503, 87, 512, 61, 908, 170, 897, 275, 653,

426, 154, 509, 612, 677, 765, 703 };

string sa[11] = {

"a", "heavy", "snow", "was", "falling", "when",

"they", "left", "the", "police", "station" };

int main() {

// вызвать конструктор для инициализации arrd

Arraydouble arrd( da, sizeof(da)/sizeof(da[0]) );

// вызвать конструктор для инициализации arri

Arrayint arri( ia, sizeof(ia)/sizeof(ia[0]) );

// вызвать конструктор для инициализации arrs

Arraystring arrs( sa, sizeof(sa)/sizeof(sa[0]) );

cout "sort array of doubles (size == "

arrd.size() ")" endl;

sort(arrd, 0, arrd.size()-1 );

display(arrd);

cout "sort array of ints (size == "

arri.size() ")" endl;

sort(arri, 0, arri.size()-1 );

display(arri);

cout "sort array of strings (size == "

arrs.size() ")" endl;

sort(arrs, 0, arrs.size()-1 );

display(arrs);

return 0;

}

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

sort array of doubles (size == 10)

1.7 5.7 11.7 14.9 15.7 19.7 26.7

37.7 48.7 59.7 61.7

sort array of ints (size == 16)

61 87 154 170 275 426 503 509 512

612 653 677 703 765 897 908

sort array of strings (size == 11)

"a" "falling" "heavy" "left" "police" "snow"

"station" "the" "they" "was" "when"

В числе обобщенных алгоритмов, имеющихся в стандартной библиотеке C++ (и в главе 12), вы найдете также функции min() и swap(). В главе 12 мы покажем, как их использовать.

2013-04-30 02:53:36 Dia

спасибо большое

2011-11-15 22:03:22 Максим

далеко не легкая тема!

11. Обработка исключений

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

11.1. Возбуждение исключения

Исключение – это аномальное поведение во время выполнения, которое программа может обнаружить, например: деление на 0, выход за границы массива или истощение свободной памяти. Такие исключения нарушают нормальный ход работы программы, и на них нужно немедленно отреагировать. В C++ имеются встроенные средства для их возбуждения и обработки. С помощью этих средств активизируется механизм, позволяющий двум несвязанным (или независимо разработанным) фрагментам программы обмениваться информацией об исключении.

Когда встречается аномальная ситуация, та часть программы, которая ее обнаружила, может сгенерировать, или возбудить, исключение. Чтобы понять, как это происходит, реализуем по-новому класс iStack, представленный в разделе 4.15, используя исключения для извещения об ошибках при работе со стеком. Определение класса