|
Программирование >> Дополнительные возможности наследования
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; }
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |