Читаем Программирование полностью

                          // из двух объектов класса 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

<p id="AutBody_Root232"><strong>13.3. Класс Lines</strong></span><span></p>

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

Единственный способ, который позволяет различить эти варианты, — создать отдельное окно и приписать ему другую метку.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже