Программирование >>  Дополнительные возможности наследования 

1 ... 209 210 211 [ 212 ] 213 214 215 ... 265


49: 50: 51: 52: 53; 54; 55: 56: 57: 58; 59: 60; 61; 62; 63: 64: 65: 66; 67: 68; 69; 70; 71: 72: 73: 74: 75: 76: 77; 78: 79: 80: 81: 82; 83; 84: 85; 86; 87;

90: 91: 92: 93: 94: 95; 96: 97;

return pType[offSet]; throw xBoundaryC);

return pType[0]: требование компилятора

Array;:Array(int size):

itsSize(size)

if (size == 0)

throw xZeroO; if (size < 10)

throw xTooSmall(); if (size > 30000)

throw xTooBigO; if (size < 1)

throw xNegative();

pType = new int[size]; for (int i = 0; Ksize; i++) pType[i] = 0;

int mainO {

try {

Array intArray(O);

for (int j = 0; j< 100; j++)

intArray[j] = j;

cout << intArray[ << j << ] okay...\ n

catch (Array;:xBoundary)

cout << Unable to process your input!\ n ; catch (Array;;xTooBig)

cout << This array is too big...\ n ; catch (Array::xTooSmall)

cout This array is too small.. Л n ;



99: catch (Array::xZero)

100 101 102 103 104 105 106 107 108 109 110

cout << You asked for an array ; cout of zero objects!\ n ;

catch (...) {

cout << Something went wrong!\ n

cout << Done.\ n ; return 0;

You asked for an array of zero objects! Done

В строках 26-29 создается четыре новых класса: xTooBig, xTooSmall, xZero и xNegative. В строках 56-71 проверяется размер массива, переданный конструктору. Если он слишком велик или мал, а также отрицательный или нулевой, генерируется исключение.

За блоком try следует несколько операторов catch для каждой исключительной ситуации, кроме исключения, связанного с передачей отрицательного размера. Данное исключение перехватывается оператором catch(. . .) в строке 104.

Опробуйте эту программу с рядом значений для размера массива. Затем попытайтесь ввести значение -5. Вы могли бы ожидать, что будет вызвано исключение xNegative, но этому помешает порядок проверок, заданный в конструкторе: проверка size < 10 вьшолняется до проверки size < 1. Чтобы исправить этот недостаток, поменяйте строки 61 и 62 со строками 65 и 66 и перекомпилируйте профамму.

Наслвдованив исключвниО

Исключения - это классы, а раз так, то от них можно производить другие классы. Предположим, что нам нужно создать класс xSize и произвести от него классы xZero, xTooSmall, xTooBig и xNegative. В результате для одних функций можно установить перехват ошибки xSize, а для других - перехват типов ошибок, произведенных от xSize. Реализация этой идеи показана в листинге 20.3.

Листинг 20.3. НасАвунваиив искдичвниО

2 3 4 5 6 7 8 9

ftinclude <iostream.h>

const int DefaultSize = 10;

class Array {

public:

конструкторы

Array(int itsSize = DefaultSize); Array(const Array &rhs);



11: ArrayO { delete [] pType;} 12;

13; операторы

14; Array& Dperator=(const Array&);

15; int& operator[](int offSet);

16: const int& operatorn(int offSet) const;

18: методы доступа

19; int GetitsSizeO const { return itsSize; } 20:

21: функция-друг

22; friend ostream& operator (ostreami, const Array&);

24; определения классов исключений

25; class xBoundary { } ;

26: class xSize { } ;

27; class xTooBlg ; public xSize { } ;

28; class xTooSmall : public xSize { } ;

29: class xZero : public xTooSmall { } ;

30; class xNegative ; public xSize { } ;

31; private:

32; int рТуре;

33; int itsSize;

34: } ;

37; Array;:Array(int size):

38; itsSize(size)

39; {

40; if (size == 0)

41; throw xZero();

42: if (size > 30000)

43; throw xTooBigO;

44; if (size <1)

45; throw xNegative();

46: if (size < 10)

47; throw xTooSmallO;

49: pType = new int[size];

50; for (int 1 = 0; Ksize; i++)

51: pType[i] = 0;

52; }

54; int& Array:;operator[](int offSet) 55: {

56; int size = GetitsSizeO;

57: if (offset >= 0 && offSet < GetitsSizeO)

58: return pType[offSet];

59: throw xBoundary();

60: return pType[0]; требование компилятора 61; }



1 ... 209 210 211 [ 212 ] 213 214 215 ... 265

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