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

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

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

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

Это позволяет создавать расширения, определенные пользователем, ° Класс еипстог поддерживает автоматические преобразования типов аргументов и возвращаемых значений. Например, в предыдущем примере функции-члены 5оаегипстог::орегатогО и 5овес1азз::мевЬегеипст1оп могут получать аргументы типа доиЫе вместо аргументов типа Зпт. ° При перегрузке функций-членов следует создавать дополнительный код для устранения неоднозначности.

° Класс еипстог полностью поддерживает семантику первого класса: копирование, присваивание и передачу по значению. Класс еипстог не является нн полиморфным, ни базовым. Если нужно расширить класс еипстог, в качестве базового следует применять класс еипстогтар1. ° Класс гипстог поддерживает связывание аргументов. Вызов шаблонной функции в1пдгтгзт связывает первый аргумент с фиксированным значением. В результате возникает параметризованный класс еипстог, параметрами которого являются остальные аргументы.

Рассмотрим пример. чоИ ЕО ( // определяем класс гипстог с тремя аргументами гипстог<чоИ, тугеьтзт З(1пт, 1пт, доиЫе)> сад1( зоаеепт1ту); // Связываем первый аргумент с числом 10 еипстог<чо1д, тугеь15т 2(1пт, доиЫе)> сад2( взпдг1гзт(сад1, 10); 149 Глава б. Обобщенные функторы // Эквивалентно вызову свд1(10, 20, 5.6) свд2(20, 5.6) ° Используя функцию спатп, в одном объекте класса ецпстог можно сцепить несколько объектов этого класса. цо1д тО ( гцпстог«ь свд1(зоветМ пд); гцпстог<> свд2(зоветп1пЯЕ15е); // Сцепливаеи объекты свд1 и свд2 в контейнер гцпстог«> свд5(спазп(свд1, свд2)); // эквивалентно свд1(); свд20; свд3 О; ° Затраты, связанные с использованием простых объектов класса ецпстог, состоят из одной переадресации (вызова через указатель).

При каждом связывании или сцепливании возникает один дополнительный виртуальный вызов. Параметры копируются только при необходимости преобразования типов. ° Шаблонный класс вцпстогтвр1 использует механизм распределения памяти для небольших объектов, описанный в главе 4. 150 Часть цб Компоненты РЕАЛИЗАЦИЯ ШАБЛОНА 8! МОВЕТОН Шаблон проектирования 5зпд1етоп (Оапипа ег а!., 1995) представляет собой уникальную комбинацию простого описания и сложной реализации.

Об этом свидетельствуют многочисленные книги и журнальные публикации (например, У))зз1без, 1996, 1998). Описание шаблона 5)пд1етоп в книге Сапипа ег аб (1995) весьма просто: "Шаблон гарантирует, что класс имеет только один экземпляр и обеспечивает глобальный доступ к нему". Синглтон — это улучшенный вариант глобальной переменной. Новшество заключается в том, что второй объект типа 5(пд1етоп создать нельзя. Следовательно, синглтоны можно использовать в приложениях при моделировании типов, имеюших только один экземпляр, таких как кеубоагд, оззр1ау, ягзптмападег и 5узтевС1ос)с Создавать вторые экземпляры таких классов совершенно неестественно и, кроме того, опасно.

Глобальный доступ имеет скрытые побочные последствия — с точки зрения клиента объект класса 5з пд1етоп владеет самим собой. Для создания объекта класса 51пд1етоп клиент ничего не должен делать. Слеловательно, объект класса 51пд1топе сам создает и разрушает себя. Управление продолжительностью жизни синглтона представляет собой головоломную задачу. В этой главе обсуждаются наиболее важные вопросы, связанные с проектированием и реализацией разных вариантов класса 5з пд1етоп в языке С++. ° Свойства, которые отличают синглтон от обычной глобальной переменной. ° Основные идиомы языка С++ для поддержки синглтонов. ° Обеспечение уникальности синглтона.

к Уничтожение синглтона и распознавание доступа после уничтожения. ° Усовершенствованное управление продолжительностью жизни объекта класса 5тпд1топе. ° Многопоточность. Мы опишем способы решения перечисленных выше проблем, а затем применим их для реализации обобщенного шаблонного класса 5з пд1етопно1г)ег. "Оптимальной" реализации шаблона проектирования 5зпд1етоп не сушествует.

В зависимости от конкретной задачи наилучшими оказываются различные реализации, включая машинно-зависимые. Подход, описанный в этой ~лаве, предназначен лля разработки семейства реализаций на основе обобщенного скелета класса в духе проектирования на основе стратегИй (глава 1). Класс 5(пд1етопиапд оставляет также возможности для его расширения и настройки. В конце этой главы мы разработаем шаблонный класс 5зпд1етопно1дег, способный генерировать много синглтонов разного типа. Класс 5)пд1етопно1дег предостав- ляет программисту возможности для летального управления распределением памяти при создании и уничтожении синглтонов при условии, что это нс создаст опасности лля потоков, Кроме того, класс определяет, что делать, сели пользователь попытался обратиться к уже разрушенному синглтону.

Шаблонный класс зтп91етопно1дег предоставляет программисту функциональные возможности, выходяшие за рамки обычных типов, определенных пользователем, 6.1. Статические данные+ статические функции 1= синГлтсн На первый взгляд кажется, что для создания класса ядпд1етоп нужны лишь статические функции-члены и переменные-члены. с1азэ гопт ( с1аээ Рг(птегрогт ( ... ); с1аээ РгдптзоЬ [ с1азз Муоп1уРГ(лтаг ( риызс." зтатзс ио(д дддггзптзоЬ(гг1птзоЬб певзоЫ з Е(рг3 птпиеце . евргуО бб ргд птд пдгогт .

аиа(1аЫ еО) ( рг1птзпогогт . эепд(певзоЬ.ОатаО); ) е1зе ( ргзлтциеие„.риэЬ(певзоЫ; ) рг1иате: // все данные являются статическими зтатзс этд::йиеие«РГ(птзоЬ> рг1птОиеце ; этатдс Ргз'птеггогт ргз'птМпогогт ; зтатзс гопт деЕац1тгопт ; Ргз'птзоь эовеггзптзоЬ("муросивепт.тхт"); муоп1уггзптег:гдддггзптзоь(эовеггзптзоЫ; Однако это решение' в некоторых ситуациях имеет много недостатков.

Основная проблема заключается в том, что статические 4уикиии ие могум быть еиртуальиыии, что не позволяет изменять поведение объекта при открытии кода класса муоп1 уггз птвг. Кроме того, инициализация и удаление объекта затрудняются. В классе муоп1 угг( птег нет конкретных точек, в которых инициализируются и удаляются данные, хотя эти задачи мокнут быть нетривиальными — например, переменная-член деЕаи1тгопт может зависеть от скорости обмена данными порта, поведение которого описывается переменной ргдптзпйгогт .

Таким образом, реализация синглтоноа сводится к созланию и управлению уникальным объектом, при этом создавать другие объекты такого типа запрешено. ' На самом деле этот код иллюстрирует шаблон проектирования Мспеатате (Вай апд Сгавтогд, 199Н. 152 Часть!1, Компоненты 6.2. Основные идиомы языка С++ для поддержки .синглтонов Чаше всего синглтоны создаются с помошью вариаций следуюшей идиомы. // Заголовочный файл 5)пд1етоп.)з с1азз 5)пд1етоп риЫ)с: зтатсс 5)пд1етоп* 1пзСапсеО // Единственная точка доступа ( 1т (!ртпзтапсе ) р1пзСапсе = пеи 5)пд1етоп; гетмгп р1пзтапсе ; операции рг)часе: 51пд)етопо ! // Предотвращает создание нового // объекта класса 5)п91еСоп 5!п91есоп(сопзс 5)пд)есопй)! // предотвращает создание // копии объекта класса 5)пд1есоп зсас)с 5)пд1есопй* ртпзсапсе ; // Единственный экземпляр // Файл реализации 5)п91есап.срр 5)пд1есоп* 5)пд1есоп::ртпзсапсе = О! Поскольку все конструкторы закрыты, код пользователя не может создать объект класса 5)пд1есоп.

Однако класс содержит функции-члены, в частности, функцию 1пзсапсе, которые лозволяюю создавать объекты. Следовательно, требование уникальности объекта класса 5)п91есоп накладывается на этапе компиляции. В этом и заключается суть реализации шаблона проектирования 51пд1еСоп в языке С++. Если объект класса 5тпд1есоп никогда не используется (в программе нет вызовов функции 1пзсапсе), он не создается. Для осушесталения такой оптимизации в начале функции 1пзсапсе выполняется дополнительная проверка (обычно весьма несложная).

Преимушество такого подхода становится значительным, если объект кчасса 5)пд1есоп требует для своего создания больших затрат и в то же время редко используется. Есть большое искушение упростить класс, заменив указатель р1пзтапсе в предыдушем примере полноценным объектом класса 5)п91есоп. //Заголовочный файл 51п91еСоп.Н с1азз 5)пд1есоп рцЫ1с: зтат1с 5)пд!етоп* 1пзтапсеО // Единственная точка доступа гесцгп 8лпьсапсе ) зпс оо5омесМпд() ! рг)часе: зтат)с 51п91еСоп )пзтапсе ; // еайл реализации 51пд1есоп.срр 5)пд1етоп 5)пд1етоп::!пзтапсе Это неудачное решение. Несмотря на то что переменная зпзтапсе является статическим членом класса 51п91есоп (как и указатель р1пЗСапсе в прельшушем при- '! 53 Глава 6.

Реализация шаблона 6!пд)есоп мере), между этими вариантами есть существенная разница. Переменная-член дпзтапсе инициализируется динамически (с помошью вызова конструктора класса 5)од)етоп во время выполнения программы), в то время как переменная рхпзтапсе инициализируется гп1атически (она относится к типу, не имеюшем> конструктора, и инициализируется статической константой).

Компилятор выполняет статическую инициализацию до первого оператора компоновки (аззешЫу орегагог) программы. (Обычно статическая инициализация соответствует файлу, содержашему выполняемую программу, т,е, загрузка — это инициализация.) С другой стороны, в языке С++ не определен порядок динамической инициализации объектов, принылежаших разным транслируемым модулям (цапз!ацоп цп!!в), что приводит к многочисленным недоразумениям. (Прше говоря, транслируемый мог)уль — это компилируемый исходный файл.) Рассмотрим следуюший код.

// 5ошег11е.срр П!пс1цде '5зпд1етоп.Ь" )пт 91оЬа! = 5)пд1етоп::гпзтапсеО->оовошетйзпдО; В зависимости от порядка инициализации, выбранного компилятором для переменных )пзтапсе и д1оЬа1, вызов функции-члена 5!пд1етоп::тпзтапсе может возвращать объект, который еше не создан, Это значит, что переменную дпзтапсе нельзя считать проинициализированной, если ее использует другой внешний объект. 6.3. Обеспечение уникальности синглтонов Обеспечить уникальность объекта класса 5(пд1етоп можно несколькими способа- ми. Некоторые из них мы уже применяли. Это закрытые конструктор па умолчанию и конструктор капираваиия. Их применение блокирует код, приведенный ниже.

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

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

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