Учебник по Visual C++ .Net


Класс CPolygon - часть 2


class CPolygon: public CObject

{

DECLARE_SERIAL(CPolygon)

public:

CTreeDoc *m_pDoc; // Обратный указатель

VECPTS m_Points; // Контейнер вещественных точек

UINT m_nPenWidth; // Толщина пера

COLORREF m PenColor; // Цвет пера

COLORREF m_BrushColor; // Цвет кисти

CDPoint m_ptLT; // Координата левого верхнего угла

CDPoint m_ptRB; // Координата правого нижнего угла

//====== Конструктор по умолчанию

CPolygon () ;

//====== Конструктор копирования

CPolygon(const CPolygons poly);

//====== Операция присвоения

CPolygons operator= (const CPolygons poly);

//====== Операция выбора i-той точки

CDPointS operator!] (UINT i);

//====== Вычисление обрамляющего прямоугольника

void GetRect(CDPointS ptLT, CDPointS ptRB);

//====== Установка обратного указателя

void Set (CTreeDoc *p); //====== Изменение атрибутов

void SettCTreeDoc *p,COLORREF bCl,COLORREF pCl,UINT pen);

//====== Создание трех простых заготовок

void MakeStar();

// Звезда

void MakeTria();

// Треугольник

void MakePent(); // Пятиугольник

//====== Изображение в контексте устройства

virtual void Draw (CDC *pDC, bool bContour);

//====== Сохранение и восстановление данных

virtual void Serialize(CArchiveS ar);

virtual ~CPolygon(); // Деструктор

//====== Новый тип данных: контейнер полигонов

typedef vector<CPolygon, allocator<CPolygon> > VECPOLY;

Каждый объект класса CPolygon должен иметь связь с данными документа. Это осуществляется путем запоминания адреса документа в переменной m_pDoc, которая играет роль обратного указателя. Такой прием, когда вложенный объект помнит адрес объемлющей его структуры данных, очень распространен в объектно-ориентированном программировании. Он существенно упрощает обмен данными между двумя объектами.

Здесь трудно обойтись без специального метода установки обратного указа-теля, в нашем случае метода Set. Дело в том, что при создании документа надо сначала создать вложенные в него объекты других классов (вспомните правило: «C++ уважает гостей»). Но в этот момент им нельзя передать адрес документа, так как он еще не создан. В таких случаях поступают следующим образом. В заголовке конструктора документа создают пустые объекты (вызывают default-конструкторы вложенных объектов), а затем в теле конструктора документа, когда он уже существует, для вложенных объектов вызывают метод, устанавливающий обратный указатель. При этом объекту передают указатель на документ (на объект собственного класса). Например: m_Poly.Set(this);




Начало  Назад  Вперед