Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вторая часть лекции.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
592.9 Кб
Скачать

Void chain::showAll(void) // Изображение элементов списка

( chain *uk = begin; // Настройка на начало списка

while (uk != NULL) // Цикл до конца списка

{ uk->pfig->show(); // Нарисовать конкретную фигуру

uk - uk->next; // Настройка на следующий элемент } }

// Конструктор создает и включает в список объект,

// связав его с конкретной фигурой из класса, производного

// от абстрактного:

chain:: chain(figure *p) // р - адрес включаемой фигуры

{ if (begin == NULL) // Определили начало списка

begin = this;

else last->next = this; // Связь с предыдущим элементом

pfig = p; // Запоминаем адрес включаемой фигуры

next = NULL; // Пометим окончание списка

lastthis; // Запоминаем адрес последнего элемента

// списка }

Void main()

{ point А(100,80), В(300,200); circ С(А,60); ellips Е(В,200,100) ;

{ // Переменные для инициализации графики:

int dr = DETECT, mod;

// Инициализация графической системы:

initgraph (fidr, &mod, "с: \\borlandc\\bgi") ;

A. show (); getchO; // Изобразить точку – point:: show ()

В.show(); getchO; // Изобразить точку // Показать окружность - circ::show():

С.show(); getch();

// Включить в список первый элемент - окружность С: chain са(&С);

Е.show(); getch(); // Показать эллипс –

ellips::show(); chain ce(&E); // Включить в список эллипс

// Совместить фигуры –

circ::figure::move():С.move(В); getch();

// Убрать эллипс

ellips::figure::hide():E.hide() ; getch() ;

// Убрать окружность

circ::figure::hide():C.hide () ; getch() ;

// Изобразить все фигуры из списка: c

hain::showAll(); getch(); }

closegraph(); }

Рис. 10.8. Последовательность изображений на экране при выполнении программы Р10-09. СРР

Статическая компонентная функция chain:: showAll () обеспечи­вает вывод на экран изображений всех конкретных фигур, включен­ных в односвязный список. Важно отметить последовательность передач управления в этой функции. Указатель uk типа chain * по­зволяет обратиться к компоненту pfig - указателю на абстрактный базовый класс figure. После выполнения конструктора chain () зна­чением pf ig является ссылка на объект некоторого производного от figure класса. Именно оттуда выбирается соответствующая функция show(), подменяющая чистую виртуальную функцию figure::show(). Тем самым на экран выводится изображение конкретной фигуры. Например, функция circ::show() изобразит окруж­ность и т.д.

В основной программе формируются точки а, в и на них, как на цен­трах, создаются объекты с (окружность) и Е (эллипс). В графическом ре­жиме выводятся на экран и убираются с экрана изображения всех созданных объектов. Затем функцией showAll() рисуются все объекты, включенные в список. Результат выполнения программы показан на рис. 10.8.

4. Локальные классы

Класс может быть определен внутри блока, например внутри тела функции. Такой класс называется локальным. Локализация класса пред­полагает недоступность его компонентов вне области определения класса (вне тела функции или блока, в котором он описан или определен).

Локальный класс не может иметь статических данных, так как компо­ненты локального класса не могут быть определены вне текста класса.

Внутри локального класса разрешено использовать из объемлющей его области только имена типов, статические (static) переменные, внеш­ние (extern) переменные, внешние функции и элементы перечислений. Из того, что запрещено, важно отметить переменные автоматической памяти. Существует еще одно важное ограничение для локальных классов - их компонентные функции могут быть только встроенными (inline).

Для иллюстрации особенностей, локальных классов рассмотрим сле­дующую задачу. Пусть требуется определить класс "квадрат". Ограничим­ся квадратами, стороны которых параллельны осям прямоугольной декартовой системы координат. Исходными данными для задания каждого конкретного квадрата (объекта класса "квадрат") будут координаты центра и размер стороны. Внутри класса "квадрат" определим локальный класс "отрезок". Исходными данными для определения каждого конкретного отрезка будут координаты его концов. Четыре отрезка с соответствующим образом выбранными концевыми точками составят квадрат. Именно та­ким образом можно будет изобразить квадрат на экране (как изображения четырех отрезков).

//Р10-10.СРР - внешние, локальные и глобальные классы

#include <conio.h>

#include "point.cpp" // Внешний класс "точка"

class square // Глобальный класс "квадрат"

{ class segment // Локальный класс "отрезок"

{ point pn, pk; // Точки начала и конца отрезка

public: // Конструктор отрезка

segment(point pin = point(0,0), point pik = point(0,0))

{ pn.givex() - pin.givex(); pn.givey() = pin.givey();

pk.givex() = pik.givex(); pk.givey() = pik.givey(); }

// Доступ к граничным точкам отрезка:

point& beg(void) { return pn; } point& end(void) { return pk; }