Материалы книги получены с http://www.itlibitum.ru/
Проверка граней
Давайте еще немного расширим эту идиому и предположим, что некоторая грань может
поддерживаться или не поддерживаться объектом. О том, почему и как это может произойти, мы поговорим во время изучения переходных типов далее в этой главе, а пока ответим на вопрос: как клиент может определить, поддерживается ли некоторый объект некоторой гранью? Решение построено на другом С++-изме - перегрузке оператора !.
class ViewEvents {
private:
View* view;
public:
ViewEvents(View* v) : view(v) {}
bool operator!() { return view == NULL; }
// И т.д.
};
// В клиентском коде
ViewEvents ve(aViewGemstone);
if (!ve) {
cerr << "Вид не обрабатывает событий!" << endl;
throw interface_error;
}
Предполагается, что aViewGemstone относится к кристаллам вида, о которых говорилось выше, и содержит операторную функцию operator ViewEvents(). Ключевая строка ViewEvents ve(aViewGenistone) работает в два этапа: сначала вызывается операторная функция operator ViewEvents(), выполняющая преобразование, а затем ve конструируется с помощью конструктора копий ViewEvents. Если кристалл вида решает, что данный вид не обрабатывает событий, он может сконструировать экземпляр ViewEvents с view, равным NULL. Затем оператор ! проверяет возвращенную грань. Функции грани также могут проверять наличие объекта перед тем, как пытаться что-то делегировать ему.
Void ViewEvents::DoSomething()
{
if (!*this) // то есть if (view == NULL)
// Инициировать исключение
view->DoSomething();
}
Назад Содержание Далее
|