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

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

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

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

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

Внутри класса она будет вызывать закрыюую вирюуальную функцию поС1опе, гарантируя эквивалентность динамических типов. Соответствующий код проще, чем его объяснение. с1азз 5йаре ( рцб1)с: 56аре* с1опе() сопзт // невиртуальная функция ( // переадресовываем вызов функции Оос1опе 5паре" рС1опе = рос1опеО „ // проверяем эквивалентность типов // (этот тест может быть сложнее, чеы макрос аззегт) аззегт(турезо(*рС1опе) == турезй(ьтббз)); гетыгп рс1опе; ) рг)тате: и(гтца1 5ьаре* пос1опеО сопзт = О; // закрытая функция ); Единственным недостатком этого подхода является тот факт, что теперь нельзя использовать ковариантные типы возвращаемых значений.

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

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

Точнее говоря, их тип не совсем одинаков: тип тбепсчЛегтуре из фабрики клонирования — это указатель на объект класса дЬ- эсгассггобцсс. На самом деле фабрика получает на вход указатель на клонируемый объект, а возвращает — указатель на клон. А какие ключи хранятся в ассоциативном массиве? Они не могут быть указателями на объекты класса АЬэсгассггодисс, поскольку количество элементов ассоциативного массива не зависит от количества объектов в программе. Каждый элемент этого массива должен соответствовать отдельному шилу клонируемого объекта, что вновь приводит нас к стандартному классу зсб::суре чало. Идентификатор типа, передаваемый фабрике клонирования при необходимости создать новый объект, отличается от идентификатора типа, хранящегося в ассоциативном массиве.

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

(Вы можете найти ее в библиотеке Еойй) Класс с1опегассогу немного отличается от класса гассогу. е Класс с1опегассогу использует класс туретпГо, а не зсб::суре чего. Класс туреспго, рассмотренный в главе 2, представляет собой оболочку указателя на объект класса эсб::суре чпто. В нем определены инициализация, оператор присваивания, операторы == и <, необходимые для работы с ассоциативным массивом.

Первый оператор переадресовывает вызов оператору класса з сб:: суре ч п1о:: оре гасог==, а второй — функции зсб:: суре ч пто:: ЬеФоге. ° В классе больше нет типа хбепсчтчегтуре, поскольку идентификатор типа является неявным. ° Шаблонный параметр Ргобцсссгеасог по умолчанию задает тип дбэсгассггодисс*(<) (дбзсгассггодисс*). ° Класс тдтоРгодиссмар теперь заменен классом дэзосчессог<туретпго, Ргобисссгеасог>. Класс с1опегассогу имеет следующий вид. сеяр1асе < с1аав дбэсгассггодисс, с1аэв Ргодисссгеасог = дбэсгассггодцсс* (>)(дЬэсгассггодисс*), Глава 8. Фабрики объектов 233 севр1асе<сурепаве, с1азз> с1азз кассогувггогпо1зсу = оебаи1сгастогеяггог > с1ава с1опегассогу ( риы1с: дбзсгастягодисс* сгеасеоЬ)ест(сопят лЬзсгассргодисс* воде1); Ьоо1 яедззсег(сопят туретпФоб, Ргодисссгеасог сгеасог); Ьоо1 ипгедззсег(сопят туре1п~об); ргз'часе: суредеб дазосчессог<турехпГо, вгодисссгеасог> тдтовгодиссвар; хдтопгодиссмар аззосзас1опа ; ); Шаблонный класс С1опегассогу представляет собой полное решение задачи клонирования объектов, принадлежащих закрытой иерархии классов (т.е.

иерархии, которую невозможно модифицировать). Своей простотой и эффективностью этот класс обязан концепциям, описанным в предыдуших разделах. а также информации о типах, предоставляемой операторами сурезд и классом зсд: >буре зпбо. Если бы механизма КТП не существовало, фабрику клонирования было намного труднее реализовать. 8.8. Использование фабрики объектов в сочетании с другими обобщенными компонентами В главе 6 был разработан вспомогательный класс 5зпд1есопно1дег. Поскольку фабрики имеют глобальную природу, естественно использовать класс яассогу вместе с классом 51пд1есопно1дег.

Их легко объединить с помощью оператора суреде~. суредеУ 5зпд1есопно1дег<гассогу<5Ьаре„ зтд::зсгзпд» 5Ьарегассогу; Разумеется, для уточнения проектных решений в классы 5зпд1есопно!дег и гассогу можно добавлять аргументы, но все это происходит в одном месте. Следовательно, теперь можно собрать группу важных решений в одном месте и применить класс 5Ьарекассогу. С помощью простого определения типа, указанного выше, можно выбирать способ функционирования фабрики и синглтона.

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

Как указывалось в начале этой главы, большой интерес вызывает комбинация класса яассогу с классом Гипссог. суредеб 5зпд1есопно1дег гассогу < 5Наре, зсд::зсгзпд, гипссог<5Ьаре*> > > 5Нареяассогу; Часть П. Компоненты Использование класса гцпстог обеспечивает большую гибкость при создании объектов. Теперь новые объекты класса вйаре и его потомков можно создавать всевозможными способами, регистрируя в фабрике разные функторы.

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

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

В этом заключается принципиальная разница между "правильным" и "неправильным'* подходом. Информацию о типе во время выполнения программы на языке С+-г передавать трулно. Эта особенность носит принципиальный характер для всего семейства языков, которому принадлежит язык С++, поэтому приходится применять вместо типа его идентификатор.

Идентификаторы типов тесно связаны с вызываемыми сущностями, создающими объекты (глава ЬЬ Для определения этих ограничений реализована конкретная фабрика объектов, обобщенная в виде шаблонного класса. В заключении рассмотрены фабрики клонирования, позволяющие создавать дубликаты полнморфных объектов. 8.10. Краткий обзор шаблонного класса Рас1огу ° Объявление класса гастогу имеет следующий вид. теер1ате < с1авв лбзтгастягооист, с1аэз тдептзйегтуре, с1аэз ягодцстсгеатог = лЬзтгастягодцст* С') О, тевр1ате<турепаме, с1азз> с1аьв гастогувггогяо15су = оеГаи1тгастогуяггог > с1азз гастогу; ° Класс лЬэтгастягодист является базовым классом иерархии, для которой создается фабрика объектов. ° Класс тбептзйегтуре представляет тип, входящий в иерархию.

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

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

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