cout "swap() with ArrayRCint ia2" endl;
size = ia2.size();
swap( ia2, 1, size );
return 0;
}
Пусть мы имеем следующие объявления типов:
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);
Перепишите следующее определение, сделав из него шаблон класса:
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;
}
Имеется следующий шаблон класса:
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;
Пример из предыдущего упражнения накладывает определенные ограничения на типы данных, которые могут быть подставлены вместо elemType. Так, параметр конструктора имеет по умолчанию значение 0:
explicit Example2 (elemType val=0) : _val(val) {};
Однако не все типы могут быть инициализированы нулем (например, тип string), поэтому определение объекта
Example2string exs("Walden");
является правильным, а
Example2string exs2;
приведет к синтаксической ошибке . Также ошибочным будет вызов функции min(), если для данного типа не определена операция меньше. С++ не позволяет задать ограничения для типов, подставляемых в шаблоны. Как вы думаете, было бы полезным иметь такую возможность? Если да, попробуйте придумать синтаксис задания ограничений и перепишите в нем определение класса Example2. Если нет, поясните почему.
Как было показано в предыдущем упражнении, попытка использовать шаблон Example2 с типом, для которого не определена операция меньше, приведет к синтаксической ошибке. Однако ошибка проявится только тогда, когда в тексте компилируемой программы действительно встретится вызов функции min(), в противном случае компиляция пройдет успешно. Как вы считаете, оправдано ли такое поведение? Не лучше ли предупредить об ошибке сразу, при обработке описания шаблона? Поясните свое мнение.
2.6. Использование исключений
Исключениями называют аномальные ситуации, возникающие во время исполнения программы: невозможность открыть нужный файл или получить необходимое количество памяти, использование выходящего за границы индекса для какого-либо массива. Обработка такого рода исключений, как правило, плохо интегрируется в основной алгоритм программы, и программисты вынуждены изобретать разные способы корректной обработки исключения, стараясь в то же время не слишком усложнить программу добавлением всевозможных проверок и дополнительных ветвей алгоритма.