
- •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 showSeg() // Изобразить отрезок на экране
{ line (pn.givexO, pn.givey(),
pk.givexO, pk.givey(); } }; // Конец определения класса segment
segment ab, be, cd, da; // Отрезки - стороны квадрата public:
// Конструктор квадрата:
square (point ci = point(0,0), int di = 0)
{ // Вершины квадрата - локальные объекты
// конструктора:
point а, b, с, d; a.givex() = ci.givex() - di/2; a.givey() = ci.givey() - di/2; b.givex() = ci.givex() + di/2;
b. giveyz() = ci.givey() - di/2; c.givex() = ci.givex() + di/2;
c. givey() = ci.givey() + di/2; d.givex() + ci.givex() - di/2; d.givey () = ci.giveyO + di/2;
// Граничные точки отрезков:
ab.beg() = a; ab.end() = b; bc.beg() = b; bc.end() = c; cd.beg() = c; cd.end() = d; da.beg() = d; da.end() = a;
}
Void showSquare(void) // изобразить квадрат
{ ab.showSeg() ;
be.showSeg();
cd.showSeg () ;
da.showSeg(); } }; // Конец определения класса "квадрат"
void main ()
{ // Переменные для инициализации трафики:
int dr = DETECT, mod;
// Инициализация графической системы:
initgraph(fidr,fimod,"с:\\borlandc\\bgi");
point pi(80,120);
point p2(250,240);
square A{pl,30);
square B(p2,140) ;
A.showSquare(); getch();
В.showSquare (); getch();
closegraph() ; }
Результат в графическом виде показан на рис. 10.9.
Рис. 10.9. Изображения на экране при выполнении программы Р10-10. СРР
Отметим некоторые особенности программы. Класс "квадрат" (square) включает в качестве данных четыре стороны - отрезки аb, bc, cd, da, каждый из которых есть объект локального класса segment. Конструктор класса square <) по заданным центру квадрата и размеру стороны определяет значения точек-вершин, а уже по ним формирует отрезки - стороны квадрата.
5. Классы и шаблоны
Шаблоны, которые иногда называют родовыми или параметризованными типами, позволяют создавать (конструировать) семейства родственных функций и классов [2], [9].
Как уже говорилось в главе 6, шаблон семейства функций {function template) определяет потенциально неограниченное множество родственных функций. Он имеет следующий вид:
template <список_параметров_шаблона> определекие_функции
Здесь угловые скобки являются неотъемлемым элементом определения. Список параметров шаблона должен быть заключен именно в угловые скобки.
Аналогично определяется шаблон семейства классов:
template <список_параметров_шаблона> определение класса
Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов.
Как уже отмечалось в связи с шаблонами функций, определение шаблона может быть только глобальным.
Следуя авторам языка и компилятора Си++ [2, 9], рассмотрим векторный класс (в число данных входит одномерный массив). Какой бы тип ни имели элементы массива (целый, вещественный, с двойной точностью и т.д.), в этом классе должны быть определены одни и те же базовые операции, например доступ к элементу по индексу и т.д. Если тип элементов вектора задавать как параметр шаблона класса, то система будет формировать вектор нужного типа (и соответствующий класс) при каждом определении конкретного объекта.
Следующий шаблон позволяет автоматически формировать классы векторов с указанными свойствами:
//TEMPLATE.VEC - шаблон векторов template
<class T> // Т - параметр шаблона class Vector
{ Т *data; // Начало одномерного массива