На этом шаге мы рассмотрим описание и использование локальных классов.
Класс может быть определен внутри блока, например внутри тела функции. Такой класс называется локальным. Локализация класса предполагает недоступность его компонентов вне области определения класса (вне тела функции или блока, в котором он описан или определен).
Локальный класс не может иметь статических данных, так как компоненты локального класса не могут быть определены вне текста класса.
Внутри локального класса разрешено использовать из объемлющей его области только имена типов, статические (static) переменные, внешние (extern) переменные, внешние функции и элементы перечислений. Из того, что запрещено, важно отметить переменные автоматической памяти. Существует еще одно важное ограничение для локальных классов - их компонентные функции могут быть только встроенными (inline).
Для иллюстрации особенностей локальных классов рассмотрим следующую задачу. Пусть требуется определить класс "угол". Ограничимся углами, стороны которых параллельны осям прямоугольной декартовой системы координат, то есть прямыми углами. Исходными данными для задания каждого конкретного угла (объекта класса "угол") будут координаты вершины и символ для изображения фигуры. Горизонтальная сторона будет длиной три символа, а вертикальная - два символа.
Внутри класса "угол" определим локальный класс "отрезок". Исходными данными для определения каждого конкретного отрезка будут координаты начала отрезка и символ, который будет использоваться для изображения фигуры. Два отрезка с началом в общей точке составят угол.
Рис.1. Результат работы программы
Приведем текст программы.
//OOР34_1.СРР - внешние, локальные и глобальные классы. #include <conio.h> #include <iostream.h> #include "point.cpp" // Внешний класс "точка". class angle // Глобальный класс "угол". { class segment // Локальный класс "отрезок". { point pn; // Точка начала отрезка. char ch; // Символ отрезка. public: // Конструктор отрезка. segment(point pin = point(0,0), char c = '*') { pn.givex() = pin.givex(); pn.givey() = pin.givey(); ch = c; } // Доступ к начальной точке отрезка: point& beg(void) { return pn; } char& symbol(void) {return ch; } void showSeg_G() // Изобразить горизонтальный отрезок на экране. { gotoxy(pn.givex(),pn.givey()); cout << ch; gotoxy(pn.givex()+1,pn.givey()); cout << ch; gotoxy(pn.givex()+2,pn.givey()); cout << ch; } void showSeg_V() // Изобразить вертикальный отрезок на экране. { gotoxy(pn.givex(),pn.givey()); cout << ch; gotoxy(pn.givex(),pn.givey()-1); cout << ch; } }; // Конец определения класса segment segment ab; // Отрезки - стороны угла. public: // Конструктор угла: angle (point ci = point(0,0), char di = '+') { // Вершина угла - локальный объект конструктора: ab.beg() = ci; ab.symbol() = di; } void showAngle(void) // Изобразить угол. { ab.showSeg_G(); ab.showSeg_V(); } }; // Конец определения класса "угол". void main () { point p1(8,12); point p2(12,17); angle A (p1, '!'); angle B (p2, '$'); A.showAngle(); getch(); B.showAngle(); getch(); }
Со следующего шага мы начнем рассматривать шаблоны.