Министерство образования и науки Украины
Харьковский национальный университет радиоэлектроники
Кафедра ЭВМ
Отчет по лабораторной работе №4
Выполнил: Проверил:
1 Цель работы
Научиться выявлять и реализовывать отношение наследования между классами.
2 Задание
Вариант 2.
Даны два класса: square и triangle. Объекты этих классов могут быть отображены на экране с помощью функции-члена draw и перемещены с помощью функции-члена move_to. Создать объекты указанных классов, начертить их в нескольких положениях.
Создать общий базовый класс figure, от которого будут наследованы указанные классы. В базовый класс нужно поместить все, что является общим у исходных классов. Добавить функцию-член set_color. Добавить функцию-член rotate. Использовать указанные функции.
3 Текст программы
// lab_inherit.cpp
…//создание объектов
static square sq(5,5,20,40);
static triangle tr(120,130,20,60,100,50);
static figure *cf=&tr;
…//управление объектами
case WM_KEYDOWN:
switch(wParam)
{
case '1':
cf->set_color(RGB(0,0,255));
break;
case '2':
cf->set_color(RGB(0,255,0));
break;
case '3':
cf->set_color(RGB(255,0,0));
break;
case VK_SPACE:
if(cf==&tr)
cf=&sq;
else
cf=&tr;
break;
case VK_UP:
cf->moveto(0,-5);
break;
case VK_DOWN:
cf->moveto(0,5);
break;
case VK_LEFT:
cf->moveto(-5,0);
break;
case VK_RIGHT:
cf->moveto(5,0);
break;
case VK_ESCAPE:
cf->rotate(5);
break;
}
InvalidateRect(hWnd,NULL,TRUE);
break;
…//прорисовка объектов
sq.draw(hdc);
tr.draw(hdc);
// shape_derived.cpp
#include "stdafx.h"
#include "shape_derived.h"
#include <cmath>
#include <cassert>
figure::figure():
col_(RGB(0,0,0))
{}
void figure::set_color(COLORREF col)
{
col_=col;
}
square::square(int x, int y, int a, int b)
:figure(),x_ (x),y_ (y),a_ (a),b_ (b)
{}
void square::draw(HDC hdc)const
{
HPEN pen=CreatePen(PS_SOLID,0,col_);
HGDIOBJ old=SelectObject(hdc,pen);
::Rectangle(hdc,x_,y_,x_+a_,y_+b_);
SelectObject(hdc,old);
DeleteObject(pen);
}
void square::moveto(int r, int d)
{
x_=x_+r;
y_=y_+d;
}
void square::rotate(double angle)
{
double newx,newy;
const double pi=3.14159265;
х_=(int)newx;y_=(int)newy;
}
triangle::triangle(int x,int y,int x1, int y1,int x2, int y2)
:figure(),
x_(x),y_(y),x1_(x1),y1_(y1), x2_ (x2),y2_ (y2)
{}
void triangle::draw(HDC hdc)const
{
HPEN pen=CreatePen(PS_SOLID,0,col_);
HGDIOBJ old=SelectObject(hdc,pen);
::MoveToEx(hdc,x_,y_,NULL);
::LineTo(hdc, x1_, y1_);
::LineTo(hdc, x2_, y2_);
::LineTo(hdc, x_, y_);
SelectObject(hdc,old);
DeleteObject(pen);
}
void triangle::rotate(double angle)
{
double newx1,newy1,newx2,newy2;
const double pi=3.14159265;
::rotate(dx1_,dy1_,angle*pi/180.,&newx1,&newy1);
::rotate(dx2_,dy2_,angle*pi/180.,&newx2,&newy2);
dx1_=(int)newx1;dy1_=(int)newy1;
dx2_=(int)newx2;dy2_=(int)newy2;
}
void triangle::moveto(int r, int d)
{
x_=x_+r;
y_=y_+d;
x1_=x1_+r;
y1_=y1_+d;
x2_=x2_+r;
y2_=y2_+d;
}
void rotate(double x, double y,double angle,double* px,double *py){
double sa=sin(angle);
double ca=cos(angle);
*px=ca*x+sa*y;
*py=sa*x+ca*y;
}
// shape_derived.h
#pragma once
class figure
{
public:
figure ();
void set_color(COLORREF);
virtual void draw(HDC)const=0;
virtual void moveto(int , int )=0;
virtual void rotate(double)=0;
protected:
COLORREF col_;
};
class square:public figure {
public:
square(int x,int y, int a,int b);
void draw(HDC)const;
void moveto(int r,int d);
void rotate(double angle);
protected:
int x_, y_, a_,b_;
};
class triangle:public figure
{
public:
triangle(int x,int y,int x1, int y1, int x2, int y2);
void draw(HDC)const;
void moveto(int r,int d);
void rotate(double angle);
protected:
int x_, y_, x1_, y1_, x2_, y2_;
};
4 Выводы
Научились создавать родительские и дочерние классы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.