Пример — list |
Предыдущая Содержание Следующая |
Как пример того, что можно делать с isOf() и как может быть сделан безопасный cast(), рассмотрим следующую модификацию тестовой программы из раздела 7.7:
#include "Circle.h" #include "List.h"
int main (int argc, char ** argv) { void * q; unsigned n;
initList(); initCircle();
q = new(List, 1);
while (* ++ argv) switch (** argv) { case ’+’: switch ((* argv)[1]) { case ’c’: addFirst(q, new(Circle, 1, 2, 3)); break; case ’p’: addFirst(q, new(Point, 4, 5)); break; default: addFirst(q, new(Object)); } break; case ’-’: puto(takeLast(q), stdout); break; case ’.’: n = count(q); while (n -- > 0) { const void * p = takeFirst(q);
if (isOf(p, Point)) draw(p); else puto(p, stdout); addLast(q, p); } break; default: if (isdigit(** argv)) addFirst(q, (void *) atoi(* argv)); else addFirst(q, * argv + 1); } return 0; }
Для аргументов, начинающихся с +, эта программа добавит в список окружности, точки или простые объекты. Аргумент - удалит последний объект и покажет его на экране с помощью puto(). Аргумент . покажет текущее содержание списка; draw() используется, если запись унаследована от Point. Наконец, выполняется преднамеренная попытка поместить в список в качестве аргументов числа или другие строки, хотя они создали бы проблемы при удалении. Вот типичный вывод:
$ list +c +p + - . 1234 Circle at 0x122f4 Object at 0x12004 "." at 4,5 Object.c:66: failed assertion `sig == 0’
Как мы увидим в разделе 8.4, addFirst() использует cast(), чтобы удостовериться, что добавляет к списку только объекты. cast() может даже быть сделан достаточно надёжным, чтобы обнаружить, что число или строка пытаются изобразить из себя объект.
|
Предыдущая Содержание Следующая |