// из двух объектов класса Points
};
Класс Line
Shape
. Именно это означает строка “:Shape”
. Класс Shape
называют 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 как часть отдельного графического объекта, то могли бы дать такое определение:Lines x;
x.add(Point(100,100), Point(200,100)); // первая линия:
горизонтальная
x.add(Point(150,50), Point(150,150)); // вторая линия: вертикальная
В этом случае мы получили бы совершенно такой же результат (вплоть до последнего пикселя), как и в варианте с классом Line
Единственный способ, который позволяет различить эти варианты, — создать отдельное окно и приписать ему другую метку.