С++ - язык, который изучается постепенно.ГЛАВА 13. Конструирование с разделением фаз
создание сайта визитки
Студия Web-дизайна, создание, раскрутка сайтов интернет реклама, подача объявлений на доски, продвижение и сопровождение сайтов
Карта сайта | Зарабатывайте с нами  | Сделать заказ
Наши услуги
Справочники
Самоучитель Internet Explorer
PHP и MySQL
Компьютерные сети
Самоучитель о С++
Новости
Новости для PDA
Реклама
Студия WebKuban.Ru - Создание и поддержка сайтов, интернет магазинов Каталог сайтов Всего.RU Интернет-каталог WWW.SABRINA.RU Refo.ru - русские сайты Каталог HeadNet.Ru Интернет-магазин цифровых товаров Каталог Ресурсов Интернет
Реклама
Язык С++
По последним данным, на рынке продается по крайней мере 2 768 942 книги о С++, не говоря уже о всевозможных курсах, обучающих программах, журналах и семинарах с коктейлями.
И все же в этом изобилии наблюдается удручающее однообразие.
Добро пожаловать на сайт студии Web-дизайна "САР"


Материалы книги получены с http://www.itlibitum.ru/

Конструирование с разделением фаз

Эта идиома предложена Джеймсом Коплином (James Coplien), который назвал ее «виртуальным конструктором». Что делает следующий перегруженный оператор new?

class Foo {

public:

void* operator new(size_t, void* p) { return p; }

};

На первый взгляд - ничего; пустая трата времени. Но так ли это? Что произойдет в следующем фрагменте?

union U {

Foo foo;

Bar bar;

Banana banana;

};

U whatIsThis;

Компилятор С++ не может определить, какой конструктор следует вызывать для whatIsThis - Foo::Foo(), Bar::Bar() или Banana::Banana(). Разумеется, больше одного конструктора

вызывать нельзя, поскольку все члены занимают одно и то же место в памяти, но без инструкций от вас не может выбрать нужный конструктор. Как и во многих других ситуациях, компилятор поднимет руки; он сообщает об ошибке и отказывается принимать объединение, члены которого имеют конструкторы. Если вы хотите, чтобы одна область памяти могла инициализироваться несколькими различными способами, придется подумать, как обмануть компилятор. Описанный выше «пустой» конструктор подойдет лучше всего.

unsigned char space[4096];

Foo* whatIsThis = new(&space[0]) Foo;

Фактически происходит то, что в С++ происходить не должно - вызов конструктора. При этом память на выделяется и не освобождается, поскольку оператор new ничего не делает. Тем не менее, компилятор С++ сочтет, что это новый объект, и все равно вызовет конструктор. Если позднее вы передумаете и захотите использовать ту же область памяти для другого объекта, то сможете снова вызвать хитроумный оператор new и инициализировать ее заново.

При создании объекта оператором new компилятор всегда использует двухшаговый процесс:

1. Выделение памяти под объект.

2. Вызов конструктора объекта.

Этот код запрятан в выполняемом коде, генерируемом компилятором, и в обычных ситуациях второй шаг не выполняется без первого. Идиома виртуального конструктора позволяет надеть повязку на глаза компилятору и обойти это ограничение.

Оперативное изменение типа объекта

Если позднее Foo вам надоест и вы захотите использовать ту же область для Banana, то при наличии у Banana того же перегруженного оператора new вы сможете быстро сменить тип объекта.

Banana* b = new(&space[0]) Banana;

Пуф! Был Foo, стал Banana. Это и называется идиомой виртуального конструктора. Такое решение полностью соответствует спецификации языка.

Ограничения

Применяя эту идиому, необходимо помнить о двух обстоятельствах:

1. Область, передаваемая оператору new, должна быть достаточна для конструирования класса.

2. Об изменении должны знать все клиенты, хранящие адрес объекта!

Будет весьма неприятно, если вы сменили тип объекта с Foo на Banana только для того, чтобы какой-нибудь клиентский объект тут же вызвал одну из функций Foo.


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



Специальное предложение


Сайт визитка за 90 $
создание, разработка сайта
  • Регистрация доменного имени в зоне .net.ru или .pp.ru (1 год)
  • Хостинг (1 год)
  • Готовый дизайн
  • Поддержка РНР
  • 3 страницы сайта (главная, о фирме, контакты)
  • Регистрация в 256 поисковых системах и каталогах
  • Форма сообщений
заказать создание сайта визитки
Размещение объявлений
Недорого предлагаем разослать ваше рекламное предложение о товарах или услугах на сотни досок объявлений по всему Рунету.
размещение объявлений на электронных досках
Друзья сайта
  • Реклама - каталог ресурсов Реклама - каталог ресурсов - Реклама Карта сайта
  • Просто добавь свой сайт
  • Ипотека, коммерческая и загородная недвижимость, продажа квартир и коттеджей
  • Выставки, выставки России, Выставки Москвы, зарубежные выставки
  • Music singer R&B song
  • Язык С++
    Просматривать полку книг о С++ в книжном магазине ничуть не интереснее, чем литературу по бухгалтерии. В сущности, все книги пересказывают одно и то же и отличаются разве что по весу и количеству цветов в диаграммах и таблицах.
    Copyright студия Web-дизайна САР © 2007
    Используются технологии uCoz