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

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; // Начало одномерного массива