
- •Void main (){
- •Операции, определенные по умолчанию над структурированными объектами
- •Void binar(unsigned char ch)
- •Void main() { int k;
- •Расширение действия (перегрузка) стандартных операций
- •Доступ к компонентам структурированного объекта
- •Void ff(cl1 cl,cl2 c2) { тело_функции }
- •Void f1(...);
- •Void f2(...);
- •Классы и шаблоны
- •Int size; // Количество элементов в массиве
- •Vector(int); // Конструктор класса vector
- •Имя_параиетризованного_класса
- •Int length;
- •Void main () {
- •Наследование и другие возможности классов Наследование классов
- •2. Множественное наследование и виртуальные базовые классы
- •Void show ()
- •Void hide()
- •Void riesquare(void)
- •Void show()
- •Void hide()
- •Void show(void)
- •Void hide()
- •Void main()
- •Void show() // Изобразить на экране эллипс
- •Void hide() { int cc, bk;
- •Int min(int valuel, int value2)
- •Void show()
- •Void hide() // Убрать изображение с экрана дисплея
- •Void main()
- •3. Виртуальные функции и абстрактные классы
- •Void main (void)
- •Имя_проиаводного_класса: : show ()
- •Иня_объекта_производноро_класса. Show ()
- •Void main(void)
- •Void sos (int) ;
- •Void func(char);
- •Void sos (int) ;
- •Void chain::showAll(void) // Изображение элементов списка
- •Void main()
- •4. Локальные классы
- •Void showSeg() // Изобразить отрезок на экране
- •Void showSquare(void) // изобразить квадрат
- •5. Классы и шаблоны
- •Int size; // Количество элементов в массиве
- •Vector(int); // Конструктор класса vector
- •Имя_параиетризованного_класса
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; // Пометим окончание списка
last — this; // Запоминаем адрес последнего элемента
// списка }
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; }