|
Программирование >> Дополнительные возможности наследования
69: if (size == 0) 70: throw xZero(size); 71: if (size > 30000) 72: throw xTooBig(slze): 73: if (size <1) 74: throw xNegative(size); 75: if (size < 10) 76: throw xTooSnalKsize); 78: pType = new int[size]; 79; for (int i = 0; i<size; i++) 80: pType[i] = 0; 81: } 84: int& Array::operator[] (int offSet) 85: { 86: int size - GetitsSizeO; 87: if (OffSet >= 0 && offSet < GetitsSizeO) 88: return pType[offSet]; 89: throw xBoundaryO; 90: return pType[0]; 91: } 93: const int& Array::operator[] (int offSet) const 94: ( 95: int size = GetitsSizeO; 96: if (OffSet >= 0 && offSet < GetitsSizeO) 97: return pType[offSet]; 98: throw xBoundaryO; 99: return pType[0]; 100: ) 101: 102: int mainO 103: { 104: 105: try 106: ( 107: Array intArray(9); 108: for (int j = 0; j< 100; j++) 109: { 110: intArray[j] = j; 111: cout intArray[ ] << ] okay,.. << endl; 112: } 113: } 114: catch (Array::xBoundary) 115: { 116: cout Unable to process your input!\ n ; 117: } 118: catch (Array::xZero theException) 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 cout You asked for an Array of zero objeotsl endl; cout Received theExosption,GetSizeO endl; catch (Array::xTooBig theException) cout This Array is too big , endl; cout Received theException,GetSize() << endl; catch (Array::xTooSmall theException) cout This Array is too small. endl; cout Received theException,GetSizeO endl; catch (,..) cout << Something went wrong, but Ive no idea what!\ n ; cout << Done.\ n ; return 0; This array is too small,., Received 9 Done. Объявление класса xSize было изменено таким образом, чтобы включить в него переменную-член itsSize (строка 33) и функцию-член GetSizeO (строка 31). Кроме того, был добавлен конструктор, который принимает целое число и инициализирует переменную-член, как показано в строке 29. Производные классы объявляют конструктор, который лишь инициализирует базовый класс. При этом никакие другие функции объявлены не были (частично из экономии места в листинге). Операторы catch в строках 114-136 изменены таким образом, чтобы создавать именованный объект исключения (thoExceptlon), который используется в теле блока oatoh для доступа к данным, сохраняемым в переменной-члене ItsSize. ПРИМЕЧАНИЕ При работе с исключениями следует помнить об их сути: если уж оно возникло, значит, что-то не в порядке с распределением ресурсов, и обработку этого исключения нужно записать таким образом, чтобы вновь не создать ту же проблему. Следовательно, если вы создаете исключение OutOfMemory, то не стоит в конструкторе этого класса пытаться выделить память для какого-либо объекта. Весьма утомительно писать вручную все эти конструкции с операторами oatoh, каждый из которых должен выводить свое сообщение. Тем более, что при увеличении объема профаммы стремительно возрастает вероятность возникновения в ней ошибок. Лучше переложить эту работу на объект исключения, который сам должен определять тип исключения и выбирать соответствующее сообщение. В листинге 20.5 для решения этой проблемы использован подход, который в большей степени отвечает принципам объектно-ориентированного программирования. В классах исключений применяются виртуальные функции, обеспечивающие полиморфизм объекта исключения. Аисшииг 20.5. Передача аргдменшов как ссылок и испонзование виршуаньных фднкций в киассах исхшчений 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #include <iostream.h> const int DefaultSize = 10; class Array { public; конструкторы Array(int itsSize = DefaultSize); Array(const Array &rhs); ArrayO { delete [] pType; } операторы Array& operator=(const Array&); int& operator[](int offSet); const int& operator[](int offSet) const; методы доступа int GetitsSizeO const { return itsSize; } функция-друг friend ostream& operator<< {ostream&, const Array&); определение классов исключений class xBoundary { } ; class xSize { public; xSize(int size):itsSize(size) { } xSizeOi } virtual int GetSizeO { return itsSize; virtual void PrintErrorO cout << Size error. Received; ; cout << itsSize << endl; protected; int itsSize; class xTooBig ; public xSize
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |