ТОП 10:

Структура наслідування класів



       
 
СShape
 
   

 

 


 

               
 
СPoint
 
СTriangle
 
СQuadrangle
 
СCircle

 


Обґрунтування вибору методу

Дану задачу можливо вирішити декількома способами

а) За допомогою структурного програмування.

Розробляється структура яка описую фігуру, потім ця структура використовується різними функціями.

б) За допомогою модульного програмування

розробляється модуль (набір функцій) для роботи з фігурами на екрані комп’ютера.

в) За допомогою класів.

Розробляється клас фігури, потім він використовується для роботи

розробленою фігурою.

Обираємо третій метод для вирішення поставленої задачі. Перерахуємо основні переваги використання класів для вирішення задач даного типу:

а) Найбільш економічне використання коду.

б) Можливість легко змінити і розширити клас за допомогою таких можливостей класу як наслідування, використання віртуальних функцій, множинне наслідування, використання шаблонів в класах та ін.

в) За допомогою класів можна легко вирішити задачі великої складності, які важко вирішити іншими способами а в деяких випадках і неможливо.

Постановка задачі

Розробити базовий клас для опису фігур на екрані.

Створимо клас який буде представляти будь – яку геометричну фігуру на екрані, та який передбачає можливість її руху. В клас входить вказівник на масив точок фігури. Функції які добавляють точку, забезпечують рух фігури та вивід і виділення її на екрані. Також передбачена структура, яка задає тип руху геометричної фігури на екрані і функції, які обслуговують її.

Типи руху геометричної фігури на екрані.

enum TYPE {MT_LINE=0,/*рух по прямій лінії */

MT_OBERT, /* поворот фігури */

MT_RESHAPE,/* зміна її розмірів */

MT_USER};/* тип руху що задає користувач*/

class СShape{

protected:

POINT*p;/*вказівник на масив точок які зберігають координати точок на екрані*/

int count;/*кількість точок в фігури*/

int current; /*поточна точка фігури*/

PMOVE m_move;/*структура яка зберігає в собі тип руху фігури на екрані комп’ютера*/

public:

CShape(int); /* Конструктор вхідний параметр якого задає кількість точок на екрані комп’ютера */

virtual~shape();/* деструктор */

void set_point(int,int); // встановлює координати точки фігури

void set_move(PMOVE); /* задає тип руху фігури на екрані */

virtual void show() {};/* Віртуальна функція показує фігуру на екрані монітора, вона в кожному класі насліднику повинна переоприділена*/

virtual void move();/*Рух фігури на екрані монітора */

virtual void hide();/*стирає фігуру на екрані комп’ютера */

PMOVE get_move(){ return m_move;} // повертає структуру move

};

CShape::CShape(int count){

//cout <<"constructor shape" <<count <<endl;

if (count<1) count =1;

current=0;

this->count=count;

p=new POINT[this->count];

}

void CShape::hide(){

setwritemode(XOR_PUT);

show();

for(int i=0;i<count;i++) putpixel(p[i].x,p[i].y,0);

}

void CShape::set_move(PMOVE move) {

m_move=move;

}

void CShape::set_point(int x,int y) {

if (current<count) {

p[current].x=x;

p[current].y=y;

current++;

}

//cout<<current<<endl;

}

CShape::~CShape() {

if(p!=NULL) {

delete[] p;

}

}

void CShape::move() {

if(m_move->erase) hide();

if(m_move->type=MT_LINE) {

for(int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

if (m_move->type=MT_RESHAPE) {

for (int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

if(m_move->type=MT_OBERT) {

for(int i=0;i<count;i++) {

p[i].x+=m_move->stepx;

p[i].y+=m_move->stepy;

}

}

show();

}

Розробити клас трикутника, чотирикутника, кола, точки

Клас точки

Даний клас добавлено один член класу який задає колір точки та переоприділений метод show базового класу. Також в конструкторі викликається конструктор базового класу в якому параметр конструктора задає кількість точок в класі. В даному класі використовується одна точка.

class CPoint:public shape {

private:

int color; /*колір точки*/

public:

CPoint();/*конструктор*/

virtual~point();/*деструктор*/

virtual void show();//переоприділення функції показу фігури

};

/*реалізація конструктора*/

CPoint::CPoint():shape(1) {

}

/*реалізація деструктора*/

CPoint::~CPoint(){

}

реалізація функції показу(show)

void CPoint::show(){

setcolor(2);

line(p[0].x,p[0].y,p[0].x,p[0].y);

}

Клас трикутника

Реалізація подібна попередньому класові за винятком кількості точок які зберігає в собі клас (3 точки)

class CTriangle:public CShape {

public:

CTriangle();

~CTriangle();

virtual void show();

};

CTriangle::CTriangle():shape(3) {

}

CTriangle::~CTriangle() {

}

void Сtriangle::show() {

moveto(p[0].x,p[0].y);

lineto(p[1].x,p[1].y);

lineto(p[2].x,p[2].y);

lineto(p[0].x,p[0].y);

}

Клас чотирикутника

Аналогічно попередньому класові за винятком кількості точок для даного класу кількість точок рівняється 4

class CQuadrorange: public CShape {

public:

CQuadrorange();

~CQuadrorange();

virtual void show();

};

CQuadrorange::CQuadrorange():shape(4){

}

CQuadrorange::~CQuadrorange() {

}

void CQuadrorange::show() {

moveto(p[0].x,p[0].y);

lineto(p[1].x,p[1].y);

lineto(p[2].x,p[2].y);

lineto(p[3].x,p[3].y);

lineto(p[0].x,p[0].y);

}

Клас кола

В даному класі використовується одна точка яка задає координати центра кола. Добавлено один член класу, який зберігає в собі радіусом кола, і одну функцію, яка задає радіус кола. Переоприділена віртуальна функція show, яка відповідає за відображення геометричної фігури на екрані.

class CColo: public CShape {

private:

int radius; /* зберігає радіус кола */

public:

CColo();

~CColo();

void set_radius(int); /*функція що встановлює радіус кола*/

virtual void show();

};

/* задає тільки одну точку – центр кола на екрані */

CColo::CColo():shape(1) {

radius =0 ;

}

CColo::~CColo() {

}

void CColo::set_radius(int r) {

radius=r;

}

void CColo::show() {

circle(p[0].x,p[0].y,radius);}







Последнее изменение этой страницы: 2016-04-18; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.233.221.149 (0.01 с.)