Студопедия

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

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

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






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






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

    23: (ostream&, const Array&);

    24:

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

    26: class xBoundary { };

    27: class xSize

    28: {

    29: public:

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

    31: ~xSize(){ }

    32: virtual int GetSize() { return itsSize; }

    33: virtual void PrintError()

    34: {

    35: cout < < " Size error. Received: ";

    36: cout < < itsSize < < endl;

    37: }

    38: protected:

    39: int itsSize;

    40: };

    41:

    42: class xTooBig: public xSize

    43: {

    44: public:

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

    46: virtual void PrintError()

    47: {

    48: cout < < " Too big. Received: ";

    49: cout < < xSize:: itsSize < < endl;

    50: }

    51: };

    52:

    53: class xTooSmall: public xSize

    54: {

    55: public:

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

    57: virtual void PrintError()

    58: {

    59: cout < < " Too small. Received: ";

    60: cout < < xSize:: itsSize < < endl;

    61: }

    62: };

    63:

    64: class xZero: public xTooSmall

    65: {

    66: public:

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

    68: virtual void PrintError()

    69: {

    70: cout < < " Zero!. Received: ";

    71: cout < < xSize:: itsSize < < endl;

    72: }

    73: };

    74:

    75: class xNegative: public xSize

    76: {

    77: public:

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

    79: virtual void PrintError()

    80: {

    81: cout < < " Negative! Received: ";

    82: cout < < xSize:: itsSize < < endl;

    83: }

    84: };

    85:

    86: private:

    87: int *pType;

    88: int itsSize;

    89: };

    90:

    91: Array:: Array(int size):

    92: itsSize(size)

    93: {

    94: if (size == 0)

    95: throw xZero(size);

    96: if (size > 30000)

    97: throw xTooBig(size);

    98: if (size < 1)

    99: throw xNegative(size);

    100: if (size < 10)

    101: throw xTooSmall(size);

    102:

    103: pType = new int[size];

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

    105: pType[i] = 0;

    106: }

    107:

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

    109: {

    110: int size = GetitsSize();

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

    112: return pType[offSet];

    113: throw xBoundary();

    114: return pType[0];

    115: }

    116:

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

    118: {

    119: int size = GetitsSize();

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

    121: return pType[offSet];

    122: throw xBoundary();

    123: return pType[0];

    124: }

    125:

    126: int main()

    127: {

    128:

    129: try

    130: {

    131: Array intArray(9);

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

    133: {

    134: intArray[j] - j;

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

    136: }

    137: }

    138: catch (Array:: xBoundary)

    139: {

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

    141: }

    142: catch (Array;: xSize& theExoeption)

    143: {

    144: theException.PrintError();

    145: }

    146: catch (...)

    147: {

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

    149: }

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

    151: return 0;

    152: }

     

    Результат:

    Too small! Received: 9

    Done.

     

    Анализ: В листинге 20.5 показано объявление виртуального метода PrintError() в классе xSize, который выводит сообщения об ошибках и истинный размер класса. Этот метод замешается в каждом производном классе исключения.

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

     






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