Язык программирования C++ от Страуструпа


.Обширный интерфейс - часть 2


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

Можно следующим образом описать контейнер, реализованный как простой список с односторонней связью:

class slist_container : public container, private slist {

  public:

     void put(const T*);

     T* get();

     T*& operator[](int)

       { throw Bad_operation("slist::[](int)"); }

     T*& operator[](const* char)

       { throw Bad_operation("slist::[](char*)"); }

     // ...

};

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

class vector_container : public container, private vector {

  public:

     T*& operator[](int);

     T*& operator[](const char*);

     // ...

};

Если быть осторожным, то все работает нормально:

void f()

{

  slist_container sc;

  vector_container vc;

  // ...

}

void user(container& c1, container& c2)

{

  T* p1 = c1.get();

  T* p2 = c2[3];

  // нельзя использовать c2.get() или c1[3]

  // ...

}

Все же для избежания ошибок при выполнении программы часто приходится использовать динамическую информацию о типе ($$13.5) или особые ситуации ($$9). Приведем пример:

void user2(container& c1, container& c2)

/*

  обнаружение ошибки просто, восстановление - трудная задача

*/

{

  try {

     T* p1 = c1.get();

     T* p2 = c2[3];

     // ...

  }

  catch(container::Bad_operation& bad) {

     // Приехали!

     // А что теперь делать?

  }

}

или другой пример:

void user3(container& c1, container& c2)

/*

  обнаружение ошибки непросто,

  а восстановление по прежнему трудная задача

*/

{

  slist* sl = ptr_cast(slist_container,&c1);




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