Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 56

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 56 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 562019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 56)

Тип фабрики должен зависеть только от абстрактного изделия. Итак, подведем промежуточный итог в виде следуюшего шаблона. теер1ате < с1азз лЬзтгастягодисс, сурепаве 1депгт'тз'егтуре, сурепаве Ргодисссгеасог > с1заа яастогу ( риЬ)зс: Ьоо1 яедт'зтег(сопят тдепсзтз'егтурей !д, пгодцсгсгеасог сгеасог) ( гегигп аззосйас!опз .!пзегс( лззосмар: гча1ие суре(зд, сгеасог)).зесопд; Ьоо! цпгед!зсегед(сопят тдепсз'тз'егтурев зд) ( гесцгп аааосзас!опз .егазе(зд) == 1; 227 Глава б. Фабрики объектов АЬзтгастпгооцст* сгеатеОЬ)ест(сопзт тоепт1Негтуред 1о) ( турепаве Аааосиар::сопэт 1тегатог 1 = аьаосзат)опз т(по(1о)„ 1т (з != аьвос1ат1опз ,еппО) ( гегцгп(1->весело) О ) обработка ошибок рг(часе: туредег это::вар<тдепт1т1егтуре, АЬэтгаствгодцст> Аьвосмар; Аааосмар аззос1ат1опз Осталось только уточнить, что означает "обработка ошибок".

Следует ли генериро- вать исключительную ситуацию, если производитель изделия не зарегистрировался в фабрике", Возвращать в этом случае нулевой указатель? Прекращать работу програм- мы? Динамически загружать ту же самую библиотеку, регистрировать ее на лету и по- вторять выполнение операции? Выбор зависит от конкретной ситуации. В каждой из них может оказаться разумным одно из перечисленных решений.

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

Стратегия вастогувггог очень проста. Она представляет собой шаблонный класс с двумя параметрами; тдепт1т(егтуре и АЬзтгастягооцст. Если класс яастогудг- гогтвр1 представляет собой реализацию стратегии ГастогуЕггог, должно применять- ся слелуюшее выражение. вастогудггогтвр1<тоепт1Легтуре, АЬзтгаствгодост> тастогувггогтвр1; тдепт1Негтуре 1о; АЬзтгастргобост* рргодцст = тастогуеггогтпр1.опцпКпопптуре(1д); Класс гассогу использует квасе гастогувггогтпр1 в качестве спасательного круга: если класс СгеатеОЬ)ест не может найти ассоциацию в своем внутреннем ассоциативном массиве, он использует функцию-член Гастогуег- гогтпр1<тбепт1т1егтуре, АЬэтгастпгооцст>::Опопйпопптуре для извлечения указателя на абстрактное иэделие.

Если функция Опцпкпопптуре генерирует исключи- тельную ситуацию, она передается за пределы класса еастогу. В противном случае функция сгеатеоь)ест просто возвращает результат выполнения функции Опцп- Кпопптуре. Попробуем закодировать эти дополнения и изменения (выделенные в тексте про- граммы полужирным шрифтом). тепр1ате < с1ааа АЬэтгастпгодцст, турепапе тдепт1т1егтуре, турепапе ягооцстСгеатог, теар1ате<турепапе, с1аэз> 228 Часть И. Компоненты с1аяя рассогуеггогро1з су > с)аяя еастогу : рцЫ !с яастогуеггогро1! су<16епгз й егтуре, лЬятгастйго6ыст> ( риЫ)с: лЬятгастрго6ист* сгеатеоЬ)ест(сопят 16ептзНегтуреа зб) ( сурепаюе ляяосмар::сопят бтегатог 6 = аяяос)акоп . Нпб(66); )Е (1 ! = аз я ос! асз оп я .

еп6 О) ( гетогп (1->яесоп6) О; гетцгп Опцпкпоиптуре(66); рг)часе: ... остальные функции и данные остаются неизменныыи ... По умолчанию реализация стратегии еастогуеггог генерирует исключительн)чо ситуашцо. Класс исключительной ситуации должен отличаться ото всех других типов, чтобы клиентский код мог распознать его и принять соотвстствуюшие решения. Кроме того, этот класс должен быть производным от одного из стандартных классов исключительных ситуаций, чтобы клиентский код мог перехватывать все виды ошибок в олпом блоке сатсЬ.

Стратегия цехам! трастогуеггог содержит вложенный класс исключительной ситуации (с именем ехсерт1оп)~, производный от класса ят6:: ехсерс)оп. теюр1ате <с1аяя 16епт)Е!егтуре, с1аяя рго6исттуре> с1аяя оеУац1теастогубггог ( риЫбс: с1аяя ехсертбоп: роЫ)с ят6::ехсерт)оп роЫ)с: ехсертбоп(сопят 16ептз Н егтурее ЦлкПОИП16) ипкпоип16 (опкпоип16) ( ) ч)гтца! сопят сйаг* иЬатО ( гетигп "Фабрике передается неизвестный тип."; ) сопят 16епт)Негтуре цес16О ( гетцгп цпхпоып16 ; ); рг)часе: 16епт)Л егтуре ипхпоип16 ): рготесте6: ятасзсйго6цсттуре* опцпхпоиптуре(сопят 16епт)Негтуреб 16) ( тйгои ехсерг)оп(!6); ~ Давать этому классу другов имя (например ЕастогуЕхсертзоп) нет никакой необходимости, поскольку этот тип определен внутри шаблонного класса РеГаи1теастогуеггог.

229 Глава 8, Фабрики объектов другие, более сложные реализации стратегии Гассогуяггог могут искать идентификатор типа и возвращать указатель на подходящий объект, возвращать нулевой указатель (если генерировать исключительную ситуацию нежелательно), генерировать объект исключительной ситуации или прекращать выполнение программы. Уточнять поведение класса можно с помощью новых реализаций стратегии вастогуеггог, передавая их в качестве четвертого аргумента класса яасгогу. 8.6. Мелкие детали На самом деле реализация класса кастогу в библиотеке 1лк1 не использует класс зтб: ивар. Вместо него она применяет класс Львосуестог, оптимизированный на редкие вставки и часто повторяющиеся операции поиска элементов. Зта ситуация характерна для класса кастогу, Класс лззосуестог подробно описан в главе 11. В первоначальном варианте класса яассогу ассоциативный массив считался настраиваемым, поскольку был шаблонным параметром.

Однако часто класс львосуестог полностью удовлетворяет всем требованиям класса кастогу. Кроме того, использование стандартных контейнеров в качестве шаблонных шаблонных параметров не соответствует стандарту языка. Вот почему программисты, занимающиеся реализацией стандартных контейнеров, мокнут добавлять новые шаблонные аргументы, задавая их значения по умолчанию. Сосредоточим теперь свое внимание на шаблонном параметре ягодцсссгеатог. Вопервых, он должен обладать функциональным поведением (допускать применение оператора О и не иметь аргументов) и возвращать указатель, который можно преобразовывать в тип лЬзтгаствгодист*.

В конкретной реализации, показанной выше, объект класса ргооистсгеатог был просто указателем на функцию. Этого достаточно, если нужно создавать обьекты, вызывая оператор пев, как это бывает в большинстве случаев. Следовательно, в качестве типа вгодис ссгеасог, задаваемого по умолчанию, можно выбрать следующий: АЬзтгастягооист* (*) О Зтот тип выглядит весьма странно, так как не имеет имени.

Если после звездочки указать имя, поместив его внутри скобок, тип станет указателем на функцию, не полу- чающую никаких параметров и возвращающую указатель на класс аЬзтгастягодосс. Если все это вас по-прежнему удивляет, обратитесь к главе 5, в которой обсуждаются указатели на функцию. Кстати, в этой главе описан очень интересный шаблонный параметр, который можно передавать классу гассогу в качестве параметра вгодостсгеасог, а именно: ьцпстог<лЬзтгастягобцст*>. Зтот параметр обеспечивает отличную гибкость; можно создавать объекты, вызывая простую функцию, функцию-член или функтор, а также связывать с ними соответствующие параметры.

Код, обеспечивающий связь между ними, содержится в классе ьцпстог. Объявление шаблонного класса яастогу выглядит следующим образом. темр1ате < с1ава лбзтгаствгооост, с1азз Ыепт)Негтуре, с1азз вгодцстсгеатог = лЬзтгастягодисс* (*)П, темр1ате<турепаме, с1аьв> с1азз гастогукггогво1зсу = пе5ац1тяастогувггог > с1аьа Гассогу; Теперь класс састогу полностью готов.

Часть Н. Компоненты 8.7. Фабрика клонирования Несмотря на то что генетические фабрики, клонирующие универсальных солдат, — идея страшноватенькая, клонировать объекты языка С++ — занятие совершенно безвредное и даже полезное. Пель клонирования объектов, которую мы рассмотрим, несколько отличается от того, что мы имели в виду раньше; мы больше не должны создавать объекты с самого начала. У нас есть указатель на полиморфный объект, и мы хотели бы создать точную копию этого объекта.

Поскольку тип полиморфного объекта точно не известен, мы на самом деле не знаем, какой именно объект созлать. В этом и заключается проблема. Поскольку оригинал у нас под рукой, можно применить классический полиморфизм. Следовательно, при клонировании объекта нужно объявить в базовом классе виртуальную функцию-член с1опе и заместить ее в производном классе. Рассмотрим клонирование объектов на примере иерархии геометрических фигур.

с1аьа луаре риЫ!с: ч!гтца! луаре~ с1опеО сопле = 0; с1аьа ьбпе: рцЫэс 5паре рцЫтс: чбггца! ьэпе* с1опеО сопле гетигп пев Ипе(*тЫз); Функция-член ьт'пе::с1опе не возвращает указатель на класс 5паре, поскольку мы применили свойства языка С++, называемые ковариантными типами возвращаемых эяачеиий (сочапапг гешгп гурах). Благодаря этому замешенная виртуальная функция может возвращать указатель на производный класс, а не на базовый. Теперь, следуя идиоме, мы должны реализовать аналогичную функцию с!опе в каждом классе, который добавляется в иерархию. Эти функции имеют одно и то же содержание: создается объект класса Ро1)доп, возвращается указатель пеп по!удоя(*т)ээ' з) и т.д.

Зта идиома работает, но имеет ряд недостатков. ° Если базовый класс изначально не предназначался для клонирования (в нем не объявлялась виртуальная функция, эквивалентная функции с1опе) и молификации, то зту идиому применять нельзя. Такая ситуация возникает, например, когда вы пишете приложение, используя в качестве базовых классы из какой- нибудь библиотеки. ° Даже если все классы можно модифицировать, зта идиома требует особой осторожности.

Отсутствие реализации функции с1опе в производных классах компилятор не замечает, что может привести в непредсказуемым последствиям при выполнении программы. Первый недостаток очевиден, поэтому перейдем к обсуждению второго. Представим себе, что, создавая класс цоттедьэпе, производный от класса ь!пе, мы забыли заместить функцию цоттедьэ'пе:: с1опе. Кроме того, допустим, что у нас есть указа- 231 Глава 8. Фабрики объектов тель на объект класса 5баре, который на самом деле ссылается на объект класса поттеосз пе, и мы вызываем из этого объекта функцию с1опе.

5паре* р5йаре; 5паре* ррцр1(сате5паре = р5баре->С1опеО; Вызывается функция Сбпе::С1опе, возвращающая объект класса ьзпе. Это очень неприятно, поскольку мы предполагали, что указатель рпцр1зсатевбаре имеет тот же динамический тип, что и указатель р5Паре. Оказывается, это совсем не так, что может вызвать массу проблем — от вывода неожиданных типов до краха приложения, К сожалению, надежных средств, позволяющих компенсировать второй недостаток, не существует.

Характеристики

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6485
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее