Бьерн Страуструп - Язык программирования С++. Главы 5-7 - Прикладная программа
ОГЛАВЛЕНИЕ
Страница 39 из 70
6.4.3 Прикладная программа
Прикладная программа предельно проста. Определяется новая фигура myshape (если ее нарисовать, то она напоминает лицо), а затем приводится функция main(), в которой она рисуется со шляпой. Вначале дадим описание фигуры myshape:#include "shape.h"Глаза и рот являются отдельными независимыми объектами которые создает конструктор класса myshape:
class myshape : public rectangle {
line* l_eye; // левый глаз
line* r_eye; // правый глаз
line* mouth; // рот
public:
myshape(point, point);
void draw();
void move(int, int);
};
myshape::myshape(point a, point b) : rectangle(a,b)Объекты, представляющие глаза и рот, выдаются функцией shape_refresh() по отдельности. В принципе с ними можно работать независимо от объекта my_shape, к которому они принадлежат. Это один из способов задания черт лица для строящегося иерархически объекта myshape. Как это можно сделать иначе, видно из задания носа. Никакой тип "нос" не определяется, он просто дорисовывается в функции draw():
{
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);
}
void myshape::draw()Движение фигуры myshape сводится к движению объекта базового класса rectangle и к движению вторичных объектов (l_eye, r_eye и mouth):
{
rectangle::draw();
int a = (swest().x+neast().x)/2;
int b = (swest().y+neast().y)/2;
put_point(point(a,b));
}
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()Вновь обратим внимание на то, что функции, подобные shape_refresh() и stack(), работают с объектами, типы которых были определены заведомо после определения этих функций (и, вероятно, после их трансляции).
{
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;
}
Вот получившееся лицо со шляпой:
***********Для упрощения примера копирование и удаление фигур не обсуждалось.
* *
* *
* *
* *
* *
* *
* *
***********
*****************
***********
* *
* ** ** *
* *
* * *
* *
* ******* *
* *
***********