Объектно-ориентированное проектирование с примерами


Управление памятью - часть 5


Анализ различных классов нашей библиотеки подсказывает возможные типы исключений, которые можно оформить в виде подклассов базового класса Exception:

  • ContainerError

  • Duplicate

  • IllegalPattern

  • IsNull

  • LexicalError

  • MathError

  • NotFound

  • NotNull

  • NotRoot

  • Overflow

  • RangeError

  • StorageError

  • Underflow

Объявление класса overflow (переполнение) может выглядеть следующим образом:

class Overflow : public Exception {
public: Overflow(const char* who, const char* what)
: Exception("Overflow", who, what) {}

};

Обязанность этого класса состоит лишь в знании своего имени, которое он передает конструктору суперкласса.

В данном механизме функции-члены классов библиотеки только возбуждают исключения; они не в состоянии перехватить исключение, главным образом, потому, что ни одна из них не может осмысленно отреагировать на эту ситуацию. По соглашению мы возбуждаем исключение при нарушении условий, предполагавшихся относительно некоторого состояния. Условие представляет собой обычное булевское выражение, которое должно быть истинным в нормальной ситуации. Чтобы упростить библиотеку, мы ввели следующую функцию, не принадлежащую ни одному из классов:

inline void _assert(int expression, const Exception& exception)
{ if (!expression) throw(exception);

}

Для эффективности мы определили эту функцию как встроенную. Преимущество подобной схемы состоит в том, что она локализует все исключения (в C++ throw имеет синтаксис вызова функции). Так, для трансляторов, которые до сих пор не поддерживают исключений, можно использовать специальную директиву (-D для большинства трансляторов C++) для переопределения вызова throw в вызов другой функции-не-члена, выводящей сообщение на экран и останавливающей выполнение программы:

void _catch(const Exception& e)
{ cerr << "EXCEPTION: ";
e.display();
exit(1);

}

Рассмотрим реализацию функции insert класса Bounded:

template<class Item, unsigned int Size>


void Bounded<Item, Size>::insert(const Item& item)



Начало  Назад  Вперед



Книжный магазин