Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Как определено в файле

Point.h
, класс
Point
— это просто пара чисел типа
int
(координаты).

struct Point {

int x, y;

Point(int xx, int yy):x(xx), y(yy) { }

Point :x(0), y(0) { }

};

bool operator==(Point a, Point b) { return a.x==b.x && a.y==b.y; }

bool operator!=(Point a, Point b) { return !(a==b); }

В файле

Graph.h
определены также класс
Shape
, подробно описанный в главе 14, и класс
Line
.

struct Line:Shape { // класс Line — это класс Shape,

// определенный двумя точками

Line(Point p1, Point p2); // создаем объект класса Line

// из двух объектов класса Points

};

Класс

Line
— это разновидность класса
Shape
. Именно это означает строка
“:Shape”
. Класс
Shape
называют базовым (base class) по отношению к классу
Line
. В принципе класс
Shape
содержит возможности, чтобы упростить определение класса
Line
. Как только мы столкнемся с конкретными фигурами, например
Line
или
Open_polyline
, то увидим, что это значит (см. главу 14).

Класс

Line
определяется двумя объектами класса
Point
. Оставляя в стороне “леса” (директивы #include и прочие детали, описанные в разделе 12.3), мы можем создать линию и нарисовать ее на экране.

// рисуем две линии

Simple_window win1(Point(100,100),600,400,"Two lines");

Line horizontal(Point(100,100),Point(200,100)); // горизонтальная

// линия

Line vertical(Point(150,50),Point(150,150)); // вертикальная

// линия

win1.attach(horizontal); // связываем их

// с экраном

win1.attach(vertical);

win1.wait_for_button; // изобразить!

Выполнив этот фрагмент кода, получим на экране следующее изображение.

Пользовательский интерфейс предназначен для того, чтобы упростить работу, и класс Line довольно неплохо справляется с этим заданием. Не нужно быть Эйнштейном, чтобы понять, что инструкция

Line vertical(Point(150,50),Point(150,150));

создает (вертикальную) линию, соединяющую точки (150,50) и (150,150). Разумеется, существуют детали реализации, но вам необязательно знать их, чтобы создавать линии. Реализация конструктора класса

Line
довольно проста.

Line::Line(Point p1, Point p2) // создаем линию по двум точкам

{

add(p1); // добавляем точку p1

add(p2); // добавляем точку p2

}

Иначе говоря, конструктор просто добавляет две точки. Добавляет куда? И как объект класса

Line
рисуется в окне? Ответ кроется в классе
Shape
. Как будет описано в главе 14, класс
Shape
может хранить точки, определяющие линии, знает, как рисовать линии, определенные парами точек, и имеет функцию
add
, позволяющую добавлять объекты в объекты класса
Point
. Основной момент здесь заключается в том, что определение класса
Line
тривиально. Большая часть работы по реализации выполняется системой, поэтому программист может сосредоточиться на создании простых классов, которые легко использовать.

С этого момента оставим в стороне определение класса

Simple_window
и вызовы функции
attach
. Они не более чем “леса”, необходимые для завершения программы, но ничего не добавляющие к специфике объектов класса
Shape
.

13.3. Класс Lines

Оказывается, что мы редко рисуем отдельную линию. Как правило, мы представляем себе объекты, состоящие из многих линий, например треугольники, многоугольники, графы, лабиринты, сетки, диаграммы, графики математических функций и т.д. Одним из простейших компонентов этих составных графических объектов являются объекты класса

Lines
.

struct Lines:Shape { // связанные друг с другом линии

void draw_lines const;

void add(Point p1, Point p2); // добавляем линию, заданную

// двумя точками

};

Объект класса

Lines
представляет собой коллекцию линий, каждая из которых определена парой объектов класса
Point
. Например, если бы мы рассматривали две линии из примера в разделе 13.2 как часть отдельного графического объекта, то могли бы дать такое определение:

  • Читать дальше
  • 1
  • ...
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: