|
Программирование >> Дополнительные возможности наследования
const int& Array:;operator[](int offSet) const { int mysize = GetitsSizeO; if (offset >= 0 8,8, offset < GetitsSizeO) return pType[offSet]; throw xBoundaryO; return pType[0]; требование компилятора int mainO { try { Array intArray(O); for (int j = 0; 3< 100; }++) intArray[j] = ]; cout << intArray[ j ] okay..,\ n ; catch (Array::xBoundary) { cout << Unable to process your input!\ n ; > catch (Array::xTooBlg) ( cout This array is too big...\ n ; catch (Array::xTooSmall) { cout This array is too small...\ n ; catch (Array::xZero) { cout << You asked for an array ; cout << of zero objects!\ n ; catch (...) { cout << Something went wrong!\ n ; cout << Done,\ n ; return 0; This array is too small... Done. Здесь существенно изменены строки 27-30, где устанавливается иерархия классов. Классы xTooBig, xTooSmall и xNegative произведены от класса xSize, а класс xZero - от класса xTooSmall. Класс Array создается с нулевым размером, но что это значит? Казалось бы, неправильное исключение будет тут же перехвачено! Однако тщательно исследуйте блок catch, и вы поймете, что, прежде чем искать исключение типа xZero, в нем ищется исключение типа xTooSmall. А поскольку возник объект класса xZero, который также является объектом класса xTooSmall, то он перехватывается обработчиком исключения xTooSmall. Будучи уже обработанным, это исключение не передается другим обработчикам, так что обработчик исключений типа xZero никогда не вызывается. Рещение этой проблемы лежит в тщательном упорядочении обработчиков таким образом, чтобы самые специфические из них стояли в начале, а более общие следовали за ними. В данном примере для рещения проблемы достаточно поменять местами два обработчика - xZero и xTooSmall. Данные в классах исключений и присвпение имен объектам исключений Часто для того, чтобы программа могла отреагировать должным образом на ощибку, полезно знать несколько больще, чем просто тип возникшего исключения. Классы исключений - это такие же классы, как и любые другие. Вы абсолютно свободно можете добавлять любые данные в эти классы, инициализировать их с помощью конструктора и считывать их значения в любое время, как показано в листинге 20.4. Аисшинг 20.4. Возвращение данных нз оОъекша искдшчения 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream.h> const int DefaultSize = 10; class Array { public; конструкторы Arraydnt itsSize = DefaultSize); Array(const Array &rhs); ArrayO { delete [] pType;} операторы Array& operator=(const Arrays); int& operator[](int offSet); const int& operator[](int offSet) const; методы доступа 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 int GetitsSizeO const { return itsSize; } функция-друг friend ostream& operator<< (ostream&, const Array&); определение классов исключений class xBoundary { } ; class xSize { public: xSize(int size):itsSize(size) { } xSizeOi } int GetSizeO { return itsSize; } private: int itsSize; class xTooBig : public xSize { public: xTooBig(int size):xSize(size){ } class xTooSmall : public xSize { public: xTooSmalKint size) :xSize(size){ } class xZero : public xTooSmall { public: xZerodnt size) :xTooSmall(size){ } class xNegative : public xSize { public: xNegative(int size):xSize(size){ } private: int *pType; int itsSize; Array::Array(int size): itsSize(size)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |