Язык программирования C++ от Страуструпа

Библиотека фигур


Начнем с определения общего понятия фигуры. Определение должно быть таким, чтобы им можно было воспользоваться (как базовым классом shape) в разных классах, представляющих все конкретные фигуры (окружности, квадраты и т.д.). Оно также должно позволять работать со всякой фигурой исключительно с помощью интерфейса, определяемого классом shape:

struct shape {

  static shape* list;

  shape* next;

  shape() { next = list; list = this; }

  virtual point north() const = 0;

  virtual point south() const = 0;

  virtual point east() const = 0;

  virtual point west() const = 0;

  virtual point neast() const = 0;

  virtual point seast() const = 0;

  virtual point nwest() const = 0;

  virtual point swest() const = 0;



  virtual void draw() = 0;

  virtual void move(int, int) = 0;

};

Фигуры помещаются на экран функцией draw(), а движутся по нему с помощью move(). Фигуры можно помещать относительно друг друга, используя понятие точек контакта. Для обозначения точек контакта используются названия сторон света в компасе: north - север, ... , neast - северо-восток, ... , swest - юго-запад. Класс каждой конкретной фигуры сам определяет смысл этих точек и определяет, как рисовать фигуру. Конструктор shape::shape() добавляет фигуру к списку фигур shape::list. Для построения этого списка используется член next, входящий в каждый объект shape. Поскольку нет смысла в объектах типа общей фигуры, класс shape определен как абстрактный класс.

Для задания отрезка прямой нужно указать две точки или точку и целое. В последнем случае отрезок будет горизонтальным, а целое задает его длину. Знак целого показывает, где должна находиться заданная точка относительно конечной точки, т.е. слева или справа от нее:

class line : public shape {

/*

  отрезок прямой ["w", "e" ]

  north() определяет точку - `` выше центра отрезка и

  так далеко на север, как самая его северная точка''

*/

  point w, e;

  public:

     point north() const { return point((w.x+e.x)/2,e.y<w.y?w.y:e:y); }



Содержание раздела