Задание 3
Организация программ с использованием механизма наследования классов
Цель задания
1. Изучение механизма наследования классов.
2. Получение навыков в написании программ с использованием механизма наследования.
Методические указания
Для проверки функционирования созданных классов написать программу, использующую эти классы. В программе должны быть продемонстрированы все свойства созданных классов.
Варианты МИНИМАЛЬНОГО задания
1. Определить иерархию классов для хранения информации о летательных аппаратах. Начните с общего базового класса airship, предназначенного для хранения количества перевозимых пассажиров и количества перевозимого груза. Затем создайте два производных от airship класса airplane и balloon. Класс airplane должен хранить тип самолетного двигателя (винтовой или реактивный) и дальность полета. Класс balloon должен хранить информацию о типе газа, используемого для подъема дирижабля (водород или гелий), и его максимальный потолок (в метрах). Создайте программу для демонстрации работы этой иерархии классов.
2. Создайте исходный базовый класс building для хранения числа этажей и комнат в здании, а также общую площадь комнат. Создайте производный класс house, который наследует класс building и хранит число ванных комнат и число спален. Кроме этого создайте производный класс office, который наследует класс building и хранит число огнетушителей и телефонов.
3. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе. Человек: студент, преподаватель.
4. Точка: окружность: окружность с текстом внутри (нарисовать, стереть, передвинуть, изменить радиус). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
5. Точка: отрезок: треугольник (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
6. Точка: отрезок: выпуклый четырехугольник: трапеция (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
7. Точка: отрезок: квадрат: прямоугольник: ромб: параллелограмм (нарисовать, стереть, закрасить, передвинуть, повернуть). Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
8. Меню: горизонтальное, вертикальное, иерархическое. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
9. Окно: стековое, слоеное, всплывающее. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
10. Список: бинарное дерево: n – арное дерево. Определить классы и их иерархию, а также продемонстрировать использование введенных конструкций при работе.
Пример выполнения практического задания
Постановка задачи
Создайте класс для работы с объектом ОКНО (с рамкой, тенью и текстовой строкой внутри). Иерархия классов будет такой. Базовый класс ScreenObject описывает некоторый прямоугольный объект на экране – строку, кнопку, окно, …
Его член-данные: координаты объекта и цвет объекта.
Член- функции: конструктор и функция для вывода изображения объекта.
Этот класс имеет два производных класса: String (описывающий текстовую строку) и Window (описывающий окно).
Класс String содержит такие поля как адрес начала строки и цвет букв текста, а также конструктор, вывод текста (вспомогательная функция), изображение строки на экране.
В классе Window членами- данными являются:
nmax – максимально допустимое число включаемых в окно объектов (строк, кнопок,..);
n – фактическое число включенных объектов;
pObj – массив указателей на включенные объекты;
ColorFrame - цвет рамки окна (цвет тени – фиксированный).
Члены функции класса Window:
конструктор, рисование тени, рисование рамки, изображение всего объекта; используется также перегрузка операции << для включения в окно очередного объекта (функция возвращает 1 или 0 в качестве признака того, успешно ли включился в окно данный объект).
В примере не проводятся проверки корректности данных: не выходят ли координаты окна за рамки экрана, влезает ли объект в окно и т. п.
Структурная схема классов (представить в виде UML-диаграмм)
Член-данные | Базовый класс ScreenObject | Член-функции |
координаты левого верхнего угла: x1, y1 координаты правого нижнего угла: xr, yr цвет объекта(окна, строки, …): ColorGround | Конструктор: ScreenObject() Вывод изображения объекта: Show() смещение координат: Move () | |
адрес начала строки: pText цвет букв текста: ColorText | Производный класс String(описывает текстовую строку). | Конструктор: String () Вывод текста: DrawText() Изображение строки на экране: Show () |
максимально допустимое число включаемых в окно объектов (строк, кнопок,..): nmax фактическое число включенных объектов: n массив указателей на включенные объекты: pObj цвет рамки окна (цвет тени – фиксированный): ColorFrame | Производный класс: Window (описывает окно) | Конструктор: Window() Рисование тени: DrawShadow() Рисование рамки: DrawFrame() Изображение всего объекта: Show() Перегрузка операции << для включения в окно очередного объекта: operator << |
Исходный текст программы
// ОПИСАНИЯ КЛАССОВ
class ScreenObject
{ protected:
int x1, y1; // координаты левого верхнего угла
int xr, yr; // координаты правого нижнего угла
int ColorGround; // цвет объекта (окна, строки, …)
ScreenObject (int Xleft, int Yup, int Xright, int Ydown, int ColGround);
virtual void Show (void);
void Move (int Dx, int Dy); }; // параметры – смещения координат
class Window: public ScreenObject
{ int nmax;
int n;
int ColorFrame;
ScreenObject **pObj;
public:
Window (int Xleft, int Yup, int Xright, int Ydown, int ColGround,
int ColFrame, unsigned MaxObj);
// параметры – координаты углов окна, цвет окна и рамки,
// максимально возможное число включаемых объектов
void Show (void);
void DrawFrame (void);
void DrawShadow (void);
int operator << (ScreenObject *obj); };
class String: public ScreenObject
{ char * pText;
int ColorText;
public:
String (int xleft, int yup, int ColGround, int ColText, char *Text);
void Show (void);
void DrawText (void); };
// РЕАЛИЗАЦИЯ КЛАССОВ
#include <stdio.h >
#include <conio.h >
// class ScreenObject
ScreenObject:: ScreenObject (int Xleft, int Yup, int Xright, int Ydown,
int ColGround)
{ x1 = Xleft; y1 = Yup; xr = Xright; yr = Ydown; ColorGround = ColGround; }
void ScreenObject:: Show (void)
{ int i, j;
textbackground (ColorGround);
for(j = y1; j <= yr; j ++) // зафиксировали номер строки
for(ji= x1; i <= xr; i ++) // идем по столбцам
{ gotoxy (i, j); cprintf (“ “); } }
void ScreenObject:: Move (int Dx, int Dy)
{ x1 += Dx; y1 += Dy; { xr += Dx; yr += Dy; }
// class String
String:: String (int xleft, int yup, int ColGround, int ColText, char *Text):
ScreenObject (xleft, yup, xleft + strlen(Text, yup, ColGround)
{ ColorText = ColText;
pText = new char [strlen(Text)+1];
if (pText) strcpy (pText, Text); }
void String:: DrawText (void);
{ textcolor (ColorText);
gotoxy (x1, y1);
cprintf (“%s “, pText); }
void String:: Show (void)
{ ScreenObject:: Show (); // рисуем пустой прямоугольник для
DrawText (); } // строки и пишем в нем текст
// Class Window
Window:: Window (int Xleft, int Yup, int Xright, int Ydown, int ColGround,
int ColFrame, unsigned MaxObj):
ScreenObject (int Xleft, int Yup, int Xright, int Ydown, int ColGround)
{ ColorFrame = ColFrame;
nmax = MaxObj;
pObj = new ScreenObject *[nmax]; // выделяем память под массив указателей
if (! pObj) nmax = 0; // если не хватает памяти
n = 0; }
void Window:: DrawFrame (void)
{ int i;
textcolor (ColorFrame);
for (i = x1; i <= xr; i++)
{ gotoxy (i, y1); cprintf (“_ “); // верхняя линия
gotoxy (i, yr); cprintf (“_”); // нижняя линия рамки окна }
for (i = y1+1; i < yr; i++)
{gotoxy (x1, i); cprintf (“_ “); // левая часть
gotoxy (xr, i); cprintf (“_”); // правая часть рамки окна } }
void Window:: DrawShadow (void)
{ int i;
textcolor (BROUN);
for (i = x1 +1; i <= xr+1; i++)
{ gotoxy (i, yr+1); cprintf (“_ “); // нижняя часть тени }
for (i = y1+1; i <= yr; i++)
{gotoxy (xr+1, i); cprintf (“_ “); // правая часть тени } }
int Window:: operator << (ScreenObject *obj)
{ if (n = = nmax) return 0; //объект не может быть включен
pObj[n] = obj;
n++;
obj -> Move (x1, y1);
return 1; }
void Window:: Show (void)
{ int i;
ScreenObject:: Show ();
DrawShadow ();
DrawFrame ();
for { i = 0; i < n; i++) // выводим все объекты, включенные в окно
pObj[i] -> Show (); // здесь используется виртуальность функцииShow(),
// т.к. в pObj могут быть адреса разных объектов –
// строк, кнопок, окон, …, но все они – производные от ScreenObject
}
void main()
{
Window *wn;
String *str;
// рисуем синее окно с белой рамкой; в нем – три зеленые строки с
// надписями черными буквами
wn = new Window (5, 5, 20, 20, BLUE, WHITE, 5);
// фактические параметры функции new String() содержат координаты
// относительно левого верхнего угла окна
str = new String(2, 2, GREEN, BLACK, “Xа-Xа”);
*wn << str;
str = new String(4, 4, GREEN, BLACK, “Xи-Xи”);
*wn << str;
str = new String(6, 6, GREEN, BLACK, “Xо-Xо”);
*wn << str;
wn -> Show ();
getch ();
}