« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
    Популярное
Создание псевдонима с указанием пути к папке с базой

Функция GlobalLRUNewest

Создание окна

Создание серверных XSQL-страниц

Функция SelectObject

Global.asax

Классы

Функция AccessResource

Функция WriteComm

Глава 5. ИСПОЛЬЗОВАНИЕ СПЕЦИАЛЬНЫХ ОПЕРАТОРОВ В УСЛОВИЯХ




    Архив файлов



    Сообщества



    Документация

Статьи:: Visual Studio :: Урок 5. Управление файловым деревом :: Конструкторы и операции


отправить ссылку другу версия для печати  Обсудить на форуме

Конструкторы и операции





Конструкторы и операции

Важными моментами в жизни объектов являются те, когда они копируются или создаются на основе уже существующих. Реализация конструктора копирования объектов просто обязательна, если вы пользуетесь контейнером объектов. В случае отсутствия или некорректного тела конструктора контейнеры откажутся работать с объектами класса. Обычным приемом при этом является реализация в классе операции присвоения operator= () и последующее ее воспроизведение в конструкторе копирования. Обратите внимание на тип возвращаемого значения операции присвоения. Это ссылка (CPolygon&) на активный или стоящий в левой части операции присвоения — *this, объект класса:

CPolygoni CPolygon: :operator=(const CPolygonS poly){

//====== Копируем все данные

m_pDoc = poly.m_pDoc;

m_nPenWidth = poly.m_nPenWidth;

m_PenColor = poly.m_PenColor;

m_BrushColor = poly.m_BrushColor;

m_ptLT = poly.m_ptLT;

m_ptRB = poly.m_ptRB;

//===== Освобождаем контейнер точек

if (!m_Points.empty()) m_Points.clear();

//====== Копируем все точки. Возможно решение с помощью assign.

for (OINT i=0; i<poly.m_Points.size();

m_Points.push_back(poly.m_Points[i] )

//====== Возвращаем собственный объект

return *this;

//====== Конструктор копирования пользуется уже

//====== существующей реализацией операции присвоения

CPolygon::CPolygon( const CPolygoni poly)

{

*this = poly;

}

Довольно часто во вновь создаваемых классах переопределяют операцию выбора с помощью угловых скобок ( [ ] ). Смысл этой операции задает программист. Он часто бывает очевидным для классов объектов, содержащих внутри себя контейнеры, как в нашем случае. Так, если к полигону poly применить операцию выбора, например

CDPoint pt = poly[i];

то он возвратит свою i-ю точку, что, безусловно, имеет смысл. Если же операция [ ] возвращает ссылку на i-ю точку, то становится возможным использовать ее и в левой части операции = (присвоения). Например,

poly[i] = CDPoint (2.5, -20.);

Отметим, что в новом языке С#, который поддерживается Studio.Net 7.0, такой прием является встроенным средством языка под названием indexer. С учетом сказанного введите следующую реализацию операции [ ]:

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

void CPolygon: :Serialize (CArchiveS ar) {

//====== Если идет запись в архив,

if (ar. IsStoring() }

{

//=== то последовательно переносим туда все данные

m « m_nPenWidth « m_PenColor « m_BrushColor « m_Points. size () « m_ptLT.x « m_ptLT.y « m_ptRB.x « m_ptRB.y;

for (UINT i=0; i <m_Points . size 0 ;

m « m_Points [i] .x « m_Points [i] . y;

}

else

{

//=== При чтении из архива меняем направление обмена

UINT size;

m » m_nPenWidth » m_PenColor » m_BrushColor

» size » m_ptLT.x » m_ptLT.y

» m_ptRB.x » m_ptRB.y;

//====== Заново создаем контейнер точек полигона

m_Points . clear ( ) ;

while (size--)

{

double x, y;

m » x » y;

m_Points. oush back (CDPoint (x, v) ) ;

}

}

}

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

Напомним, что полигон хранит World-координаты всех своих точек в контейнере m_Points. Переход к Page-координатам производится с помощью функции MapToLogPt, которую мы еще должны разработать и поместить в класс документа. Двигаясь далее по коду функции Draw, мы видим, как объект настраивает контекст устройства с помощью своих личных атрибутов и изображает себя в этом контексте:

void CPolygon::Draw (CDC *pDC, bool bContour)

{

//====== Размер контейнера World-координат точек

UINT nPoints = m_Points.size();

if (!nPoints) return;

//====== Временный массив логических координат точек

CPoint *pts = new CPoint[nPoints];

//====== Преобразование координат

for (UINT i=0; KnPoints; i++)

pts[i] = m_pDoc->MapToLogPt(m_Points[i]);

pDC->SaveDC();

CPen pen (PS_SOLID,m_nPenWidth,m_PenColor);

pDC->SelectObject(Spen);

CBrush brush (bContour ? GetSysColor(COLOR_WINDOW) : m_BrushColor);

pDC->SelectObject(ibrush);

//====== Полигон изображается в предварительно

//====== подготовленном контексте устройства

pDC->Polygon(pts, nPoints);

//====== Освобождаем массив

delete [] pts;

pDC->RestoreDC(-1);

}








9 правил для начинающего Ajax-разработчика.

AJAX

Эти девять правил несложны, никаких кусков кода — только общие советы начинающим Ajax-разработчикам. Крайне вольный перевод 9 AJAX Tips & Tricks.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения.

AJAX

Приветствуем наших читателей. Что-то в последнее время много новостей и я даже не успеваю все отобрать и написать о самых интересных технологиях и продуктах. А ведь ещё и работать иногда надо. Но мимо этой новости мы просто не могли пройти - ведь AJAX и ExtJS как его наглядное воплощения это наша основная технологическая платформа. А буквально вчера вышла следующая версия в текущей ветке 2.х - 2.2 Что же там нового, полезного и интересного мы сейчас и рассмотрим.


Подробнее... | Рубрика: AJAX | Добавлено: 25.08.2008

Windows 7: под покровом тайны.

Windows 7

О преемнице Windows Vista, носящей кодовое имя Windows 7, известно очень мало. Корпорация Microsoft, наученная горьким опытом, с крайней неохотой делится с журналистами информацией о разрабатываемой системе, дабы у пользователей и разработчиков программного обеспечения не сложилось искаженное представление о продукте, которое бы повлияло на продажи новой операционки, как это случилось с "Вистой". Тем не менее, некоторые скупые сведения хоть и изредка, но просачиваются из стен редмондского гиганта.


Подробнее... | Рубрика: Windows 7 | Добавлено: 25.08.2008

Остальные статьи:

Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google
Описание VivaVisualCode
JQuery: Пара сотен плагинов в одной заметке
Касание сетки
Разработка элементов управления ASP.NET на примере навигационной панели
Сохранения параметров приложения в .Net
Custom cursors в .Net
Бегун убегает от хозяина
"Битрикс" выпустил седьмую версию CMS
Выбираем систему управления сайтом
Рынок CMS в Европе или впечатления с CeBIT 2008


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 102
Пользователей: 0