Иллюстрированный самоучитель по Visual Studio.Net


Конструкторы и операции - часть 2


С учетом сказанного введите следующую реализацию операции [ ]:

CDPointS CPolygon::operator[](UINT i)

{

if (0 <= i && i < m_Points.size ())

return m_Points[i];

return m_ptLT;

}

Функция Set для установки обратного указателя может быть совмещена (overloaded) с одноименной функцией, позволяющей изменять атрибуты изображения полигона:

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

void CPolygon::Set (CTreeDoc *p) { m_pDoc = p;

{

//====== Совмещенная версия для изменения атрибутов

void CPolygon::Set (CTreeDoc *p, COLORREF bCl, COLORREF pCl, UINT pen)

{

m_pDoc = p;

m_BrushColor= bCl;

m_PenColor = pCl;

m_nPenWidth = pen;

}

Деструктор класса должен освобождать память, занимаемую вложенным в объект контейнером точек:

CPolygon::~CPolygon()

{

m_Points.clear() ;

}

Метод GetRect получает на входе ссылки на две характерные точки прямоугольника, обрамляющего весь полигон, вычисляет координаты этих точек и возвращает их с помощью механизма передачи ссылкой:

void CPolygon::GetRect(CDPointS ptLT, CDPointi ptRB)

{

m_ptLT = m_ptRB = CDPoint(0., 0 .) ;

//====== Если полигон содержит точки контура

UINT n = ra_Points.size();

if (n > 0)

{

//====== Пробег по всем его точкам

for (UINT 1=0; i<n; i++)

{

//====== Поиск и запоминание экстремумов

double х = m_Points[i].x,

у = m_Points[i].у;

if (x < m_ptLT.x) m_ptLT.x = x;

else if (x > m_ptRB.x)

m_ptRB.x = m_Points[i].x; if (y > m_ptLT.y) ra_ptLT.y = y;

else if (y < m_ptRB.y)

m_ptRB.y = y;

}

}

//====== Возвращаем найденные координаты (ссылками)

ptLT = m_ptLT; ptRB = m_ptRB;

}

Метод сериализации данных полигона, приведенный ниже, мог бы быть более компактным, если бы для хранения точек полигона мы воспользовались бы одним из шаблонов семейства классов Collection библиотеки MFC. В эти классы уже встроена возможность сериализации. Но у нас на вооружении шаблон классов vector из другой библиотеки STL, так как он обладает рядом других привлекательных черт.


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