C++ для начинающих - страница 22

стр.

>

>int size = ia1.size();

>swap( ia1, 1, size );


>cout "swap() with ArrayRCint ia2" endl;

>size = ia2.size();

>swap( ia2, 1, size );


>return 0;

>}


Упражнение 2.13

Пусть мы имеем следующие объявления типов:


>templateclass elemType class Array;

>enum Status { ... };

>typedef string *Pstring;


Есть ли ошибки в приведенных ниже описаниях объектов?


>(a) Array int* pri(1024);

>(b) Array Arrayint aai(1024);

>(c) Array complex double acd(1024);

>(d) Array Status as(1024);

>(e) Array Pstring aps(1024);


Упражнение 2.14

Перепишите следующее определение, сделав из него шаблон класса:


>class example1 {

>public:

>example1 (double min, double max);

>example1 (const double *array, int size);


>double operator[] (int index);

>bool operator== (const example1) const;


>bool insert (const double*, int);

>bool insert (double);


>double min (double) const { return _min; };

>double max (double) const { return _max; };


>void min (double);

>void max (double);


>int count (double value) const;


>private:

>int size;

>double *parray;

>double _min;

>double _max;

>}


Упражнение 2.15

Имеется следующий шаблон класса:


>template class elemType class Example2 {

>public:

>explicit Example2 (elemType val=0) : _val(val) {};

>bool min(elemType value) { return _val value; }

>void value(elemType new_val) { _val = new_val; }

>void print (ostream os) { os _val; }

>private:

>elemType _val;

>}


>template class elemType

>ostream operator(ostream os,const Example2elemType ex)

>{ ex.print(os); return os; }


Какие действия вызывают следующие инструкции?


>(a) Example2Arrayint* ex1;

>(b) ex1.min (ex1);

>(c) Example2int sa(1024),sb;

>(d) sa = sb;

>(e) Example2string exs("Walden");

>(f) cout "exs: " exs endl;


Упражнение 2.16

Пример из предыдущего упражнения накладывает определенные ограничения на типы данных, которые могут быть подставлены вместо elemType. Так, параметр конструктора имеет по умолчанию значение 0:


>explicit Example2 (elemType val=0) : _val(val) {};


Однако не все типы могут быть инициализированы нулем (например, тип string), поэтому определение объекта


>Example2string exs("Walden");


является правильным, а


>Example2string exs2;


приведет к синтаксической ошибке . Также ошибочным будет вызов функции min(), если для данного типа не определена операция меньше. С++ не позволяет задать ограничения для типов, подставляемых в шаблоны. Как вы думаете, было бы полезным иметь такую возможность? Если да, попробуйте придумать синтаксис задания ограничений и перепишите в нем определение класса Example2. Если нет, поясните почему.

Упражнение 2.17

Как было показано в предыдущем упражнении, попытка использовать шаблон Example2 с типом, для которого не определена операция меньше, приведет к синтаксической ошибке. Однако ошибка проявится только тогда, когда в тексте компилируемой программы действительно встретится вызов функции min(), в противном случае компиляция пройдет успешно. Как вы считаете, оправдано ли такое поведение? Не лучше ли предупредить об ошибке сразу, при обработке описания шаблона? Поясните свое мнение.

2.6. Использование исключений


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

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

Механизм исключений делится на две основные части:

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