Студопедия

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

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

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






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






    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: {

    28: public:

    29: xSize(int size): itsSize(size) { }

    30: ~xSize(){ }

    31: int GetSize() { return itsSize; }

    32: private:

    33: int itsSize;

    34: };

    35:

    36: class xTooBig: public xSize

    37: {

    38: public:

    39: xTooBig(int size): xSize(size){ }

    40: };

    41:

    42: class xTooSmall: public xSize

    43: {

    44: public:

    45: xTooSmall(int size): xSize(size){ }

    46: };

    47:

    48: class xZero: public xTooSmall

    49: {

    50: public:

    51: xZero(int size): xTooSmall(size){ }

    52: };

    53:

    54: class xNegative: public xSize

    55: {

    56: public:

    57: xNegative(int size): xSize(size){ }

    58: };

    59:

    60: private:

    61: int *pType;

    62: int itsSize;

    63: };

    64:

    65:

    66: Array:: Array(int size):

    67: itsSize(size)

    68: {

    69: if (size == 0)

    70: throw xZero(size);

    71: if (size > 30000)

    72: throw xTooBig(size);

    73: if (size < 1)

    74: throw xNegative(size);

    75: if (size < 10)

    76: throw xTooSnall(size);

    77:

    78: pType = new int[size];

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

    80: pType[i] = 0;

    81: }

    82:

    83:

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

    85: {

    86: int size = GetitsSize();

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

    88: return pType[offSet];

    89: throw xBoundary();

    90: return pType[0];

    91: }

    92:

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

    94: {

    95: int size = GetitsSize();

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

    97: return pType[offSet];

    98: throw xBoundary();

    99: return pType[0];

    100: }

    101:

    102: int main()

    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[" < < j < < " ] 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: cout < < " You asked for an Array of zero objectsl " < < endl;

    121: cout < < " Received " < < theExesptiQn, GatSize() < < endl;

    122: }

    123: catch (Array:; xTooBig theException)

    124: {

    125: cout < < " This Array is too big,,, " < < endl;

    126: cout < < " Received " < < theException, GetSize() < < endl;

    127: }

    128: catch (Array;: xTooSmall theException)

    129: {

    130: cout < < " This Array is too small... " < < endl;

    131: cout < < " Received " < < theException.GetSize() < < endl;

    132: }

    133: catch (...)

    134: {

    135: cout < < " Something went wrong, but I've no idea what! \n";

    136: }

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

    138: return 0;

    139: }

     

    Результат:

    This array is too small...

    Received 9

    Done.

     

    Анализ: Объявление класса xSize было изменено таким образом, чтобы включить в него переменную-член itsSize (строкаЗЗ) и функцию-член GetSize() (строка 31). Кроме того, был добавлен конструктор, который принимает целое число и инициализирует переменную-член, как показано в строке 29.

    Производные классы объявляют конструктор, который лишь инициализирует базовый класс. При этом никакие другие функции объявлены не были (частично из экономии места в листинге).

    Операторы catch в строках 114-136 изменены таким образом, чтобы создавать именованный объект исключения (thoException), который используется в теле блока catch для доступа к данным, сохраняемым в переменной-члене itsSize.

     

    Примечание: При работе с исключениями следует помнить об их сути: если уж оно возникло, значит, что-то не в порядке с распределением ресурсов, и обработку этого исключения нужно записать таким образом, чтобы вновь не создать ту же проблему. Следовательно, если вы создаете исключение OutOfMemory, то не стоит а конструкторе этого класса пытаться выделить память для какого-либо объекта.

     

    Весьма утомительно писать вручную все эти конструкции с операторами oatch, каждый из которых должен выводить свое сообщение. Тем более, что при увеличении объема программы стремительно возрастает вероятность возникновения в ней ошибок. Лучше переложить эту работу на объект исключения, который сам должен определять тип исключения и выбирать соответствующее сообщение. В листинге 20.5 для решения этой проблемы использован подход, который в большей степени отвечает принципам объектно-ориентированного программирования. В классах исключений применяются виртуальные функции, обеспечивающие полиморфизм объекта исключения.






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