Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет124/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   120   121   122   123   124   125   126   127   ...   256
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); 


Бьерн Страуструп.
Язык программирования С++ 
 
163 
}; 
Глаза и рот являются отдельными независимыми объектами которые создает конструктор класса 
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(), работают с объектами, 
типы которых были определены заведомо после определения этих функций (и, вероятно, после их 
трансляции). 
Вот получившееся лицо со шляпой: 
*********** 
* * 


Бьерн Страуструп.
Язык программирования С++ 
 
164 
* * 
* * 
* * 
* * 
* * 
* * 
*********** 
***************** 
*********** 
* * 
* ** ** * 
* * 
* * * 
* * 
* ******* * 
* * 
*********** 
Для упрощения примера копирование и удаление фигур не обсуждалось. 


Достарыңызбен бөлісу:
1   ...   120   121   122   123   124   125   126   127   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет