Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 38. Прикладная программа



6.4.3 Прикладная программа

 Прикладная программа предельно проста. Определяется новая фигура
 myshape (если ее нарисовать, то она напоминает лицо), а затем
 приводится функция main(), в которой она рисуется со шляпой. Вначале
 дадим описание фигуры myshape:

           #include "shape.h"

           class myshape : public rectangle {
             line* l_eye;   // левый глаз
             line* r_eye;   // правый глаз
             line* mouth;   // рот
           public:
             myshape(point, point);
             void draw();
             void move(int, int);
           };

    Глаза и рот являются отдельными независимыми объектами которые
 создает конструктор класса myshape:

           myshape::myshape(point a, point b) : rectangle(a,b)
           {
             int ll = neast().x-swest().x+1;
             int hh = neast().y-swest().y+1;
             l_eye = new line(
                 point(swest().x+2,swest().y+hh*3/4),2);
             r_eye = new line(
                 point(swest().x+ll-4,swest().y+hh*3/4),2);
             mouth = new line(
                 point(swest().x+2,swest().y+hh/4),ll-4);
           }

 Объекты, представляющие глаза и рот, выдаются функцией shape_refresh()
 по отдельности. В принципе с ними можно работать независимо от
 объекта my_shape, к которому они принадлежат. Это один из способов
 задания черт лица для строящегося иерархически объекта myshape.
 Как это можно сделать иначе, видно из задания носа. Никакой тип "нос"
 не определяется, он просто дорисовывается в функции draw():

           void myshape::draw()
           {
             rectangle::draw();
             int a = (swest().x+neast().x)/2;
             int b = (swest().y+neast().y)/2;
             put_point(point(a,b));
           }

 Движение фигуры myshape сводится к движению объекта базового класса
 rectangle и к движению вторичных объектов (l_eye, r_eye и mouth):

           void myshape::move(int a, int b)
           {
             rectangle::move(a,b);
             l_eye->move(a,b);
             r_eye->move(a,b);
             mouth->move(a,b);
           }

 Наконец, определим несколько фигур и будем их двигать:

           int main()
           {
             screen_init();
             shape* p1 = new rectangle(point(0,0),point(10,10));
             shape* p2 = new line(point(0,15),17);
             shape* p3 = new myshape(point(15,10),point(27,18));
             shape_refresh();
             p3->move(-10,-10);
             stack(p2,p3);
             stack(p1,p2);
             shape_refresh();
             screen_destroy();
             return 0;
           }

    Вновь обратим внимание на то, что функции, подобные shape_refresh()
 и stack(), работают с объектами, типы которых были определены
 заведомо после определения этих функций (и, вероятно, после
 их трансляции).
   Вот получившееся лицо со шляпой:

           ***********
           *         *
           *         *
           *         *
           *         *
           *         *
           *         *
           *         *
           ***********
        *****************
           ***********
           *         *
           * **   ** *
           *         *
           *    *    *
           *         *
           * ******* *
           *         *
           ***********

 Для упрощения примера копирование и удаление фигур не обсуждалось.

 
« Предыдущая статья   Следующая статья »