Пример — list

Предыдущая  Содержание  Следующая V*D*V

Как пример того, что можно делать с 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() может даже быть сделан достаточно надёжным, чтобы обнаружить, что число или строка пытаются изобразить из себя объект.

 

Предыдущая  Содержание  Следующая