C++   ::   Хилл Мюррей

Страница: 233 из 357

Решения 2 и 3 можно использовать для построения неоднородных списков, то есть списков объектов (указателей на объекты) нескольких раличных типов. Решение 3 – это специальный вариант решения 2 с гарантией типа.

Давайте сначала исследуем простое решение с помощью поля типа, то есть решение 2. Пример со служащими и менеджерами можно было бы переопределить так:

enum empl_type (* M, E *);

struct employee (* empl_type type; employee* next; char* name; short department; // ... *);

struct manager : employee (* employee* group; short level; // уровень *);

Имея это, мы можем теперь написать функцию, которая пчатает информацию о каждом служащем:

void print_employee(employee* e) (* switch (e-»type) (* case E: cout «„ e-“name „„ „\t“ „„ e-“department „„ „\n“; // ... break; case M: cout „« e-“name «« «\t“ «« e-“department «« «\n“; // ... manager* p = (manager*)e; cout «« " уровень " «« p-“level «« «\n“; // ... break;

*) *)

и воспользоваться ею для того, чтобы напечатать список служащих:

void f() (* for (; ll; ll=ll-»next) print_employee(ll); *)

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

|< Пред. 231 232 233 234 235 След. >|

Java книги

Контакты: [email protected]