Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Листинг 20.3. Наследование исключений






    1: #include < iostream.h>

    2:

    3: const int DefaultSize = 10;

    4:

    5: class Array

    6: {

    7: public:

    8: // конструкторы

    9: Array(int itsSize = DefaultSize);

    10: Array(const Array & rhs);

    11: ~Array() { delete [] pType; }

    12:

    13: // операторы

    14: Array& operator=(const Array&);

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

    16: const int& operator[](int offSet) const;

    17:

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

    19: int GetitsSize() const { return itsSize; }

    20:

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

    22: friend ostream& operator< < (ostream&, const Array&);

    23:

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

    25: class xBoundary { };

    26: class xSize { };

    27: class xTooBig: public xSize { };

    28: class xTooSmall: public xSize { };

    29: class xZero: public xTooSmall { };

    30: class xNegative: public xSize { };

    31: private:

    32: int *pType;

    33: int itsSize;

    34: };

    35:

    36:

    37: Array:: Array(int size):

    38: itsSize(size)

    39: {

    40: if (size — 0)

    41: throw xZero();

    42: if (size > 30000)

    43: throw xTooBig();

    44: if (size < 1)

    45: throw xNegative();

    46: if (size < 10)

    47: throw xTooSmall();

    48:

    49: pType = new int[size];

    50: for (int i = 0; i< size; i++)

    51: pType[i] = 0;

    52: }

    53:

    54: int& Array:: operator[](int offSet)

    55: {

    56: int size = GetitsSize();

    57: if (offSet > = 0 & & offSet < GetitsSize())

    58: return pType[offSet];

    59: throw xBoundary();

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

    61: }

    62:

    63:

    64: const int& Array:: operator[](int offSet) const

    65: {

    66: int mysize = GetitsSize();

    67: if (offSet > = 0 & & offSet < GetitsSize())

    68: return pType[offSet];

    69: throw xBoundary();

    70:

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

    72: }

    73:

    74: int main()

    75: {

    76:

    77: try

    78: {

    79: Array intArray(0);

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

    81: {

    82: intArray[j ] = j;

    83: cout < < " intArray[" < < j < < " ] okay...\n";

    84: }

    85: }

    86: catch (Array:: xBoundary)

    87: {

    88: cout < < " Unable to process your input! \n";

    89: }

    90: catch (Array:: xTooBig)

    91: {

    92: cout < < " This array is too big...\n";

    93: }

    94:

    95: catch (Array:: xTooSmall)

    96: {

    97: cout < < " This array is too small...\n";

    98: }

    99: catch (Array:: xZero)

    100: {

    101: cout < < " You asked for an array";

    102: cout < < " of zero objects! \n";

    103: }

    104:

    105:

    106: catch (...)

    107: {

    108: cout < < " Something went wrong! \n";

    109: }

    110: cout < < " Done.\n";

    111: return 0;

    112: }

     

    Результат:

    This array is too small...

    Done.

     

    Анализ: Здесь существенно изменены строки 27—30, где устанавливается иерархия классов. Классы xTooBig, xTooSmall и xNegative произведены от класса xSize, а класс xZero — от класса xTooSmall.

    Класс Array создается с нулевым размером, но что это значит? Казалось бы, неправильное исключение будет тут же перехвачено! Однако тщательно исследуйте блок catch, и вы поймете, что, прежде чем искать исключение типа xZero, в нем ищется исключение типа xTooSmall. А поскольку возник объект класса xZero, который также является объектом класса xTooSmall, то он перехватывается обработчиком исключения xTooSmall. Будучи уже обработанным, это исключение не передается другим обработчикам, так что обработчик исключений типа xZero никогда не вызывается.

    Решение этой проблемы лежит в тщательном упорядочении обработчиков таким образом, чтобы самые специфические из них стояли в начале, а более общие следовали за ними. В данном примере для решения проблемы достаточно поменять местами два обработчика — xZero и xTooSmall.

     

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.