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

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

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

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

Если иет, то какой тип она может иметь? В обобщенном программировании обязательно нужно задавать себе такие вопросы. Каждый тип, встроенный в обобщенный код, снижает степень его универсальности. Такие типы напоминают константы, "зашитые" в тексте программы. В некоторых ситуациях имеет смысл разрешить настройку типа переменной ро?птее . Например, зто стоит сделать при работе с нестандартными модификаторами указателя, Во времена 16-битовых процессоров 1пге1 80х86 указатели могли иметь спецификаторы пеаг, айаг и Иоде, Такие модификаторы могут использоваться и в других моделях сегментированной памяти. Вторая ситуация, в которой следует настраивать тип, возникает, когда программист хочет применить наследование интеллектуальных указателей. Что если у нас есть класс ьейасузмагхртг<т>, реализованный кем-то еше, и нам нужно создать производный от него класс? Как зто сделать? Это ответственное решение, Лучше скрыть базовый класс внутри своего собственного интеллектуального указателя.

Это вполне возможно, поскольку внутренний интеллектуальный указатель имеет ту же синтаксическую структуру. С точки зрения внешнего интеллектуального указателя переменная ро)атее имеет тип ьейасу5вагтргг<т>, а не т". Наследование интеллектуальных указателей обладает интересными приложениями, в основном благодаря оператору ->. Когда оператор -> применяется к типу, который отличается от встроенного, компилятор ведет себя необычно.

После применения оператора ->, определенного пользователем, к данному типу он вновь применяет оператор -> к полученному результату и продолжает рекурсивно повторять этот процесс, пока не обнаружит указатель на встроенный тип и только тогда предоставит доступ к члену класса. Следовательно, оператор ->, определенный в интеллектуальном указателе, не обязан возвращать указатель.

Он может возвращать объект, который в свою очередь реализует оператор ->, не изменяя синтаксис его применения. Это приводит к интересной идиоме: вызовам пре- и постфункций 18ггоцз1щр, 2000). Если оператор -> возвращает объект типа роз пгегтуре по значению, последовательность его выполнения такова. 1.

Вызывается конструктор класса во?псегтуре. 2. Вызывается функция яо? псе гтуре:: оре гаго г->; вероятно, возвращается указатель на объект типа ро)птеетуре. 3. Доступ к члену класса ро?птеетуре — вероятно, вызов функции. 4. Вызывается деструктор класса ро?пгегтуре. Короче говоря, у нас есть превосходный способ блокировки вызовов функций. Зта идиома широко применяется в многопоточных средах для блокировки доступа к ресурсам.

Конструктор класса ро1пгегтуре может захватывать ресурсы, мы их можем использовать в своих целях, а в конце работы деструктор класса ро?псе гтуре освобождает их. На этом обобщения ие заканчиваются. Синтаксически-ориентированная часть "указателя" выглядит довольно бледно по сравнению с мощными средствами управления ресурсами, которыми обладают интеллектуальные указатели.

Следовательно, иногда интеллектуальные указатели могут вести себя подобно обычным. Объект, для которого ие определены операторы -> и '„не соответствует определению интеллекту- 182 Часть П, Компоненты ального указателя. Однако существуют объекты, которые можно считать интеллектуальными указателями, даже если они таковыми формально не являются.

Вернемся в реальный мир прикладного программирования и приложений. Многие операционные системы реализуют дескрипторы ()запд!ез) в виде методов доступа к определенным внутренним ресурсам, таким как окна, мьютексы или устройства. Дескрипторы являются преднамеренно замаскированными указателями. Одно из их предназначений — предотвращать непосредственный доступ пользователей к критически важным ресурсам операционной системы. В большинстве случаев дескрипторы представляют собой целые числа, указываюшие на скрытую таблицу указателей.

Эта таблица обеспечивает дополнительный уровень зашиты внутренней системы от прикладных программистов. Хотя для дескрипторов не предусмотрен оператор ->, по семантике и способу работы они похожи на указатели. Для дескрипторов нет смысла предусматривать оператор -> или *. Однако они предоставляют те же средсплз управления ресурсами, что и интеллектуальные указатели. Рассмотрим три типа интеллектуальных указателей. 1. Тяп хрдяеияя (могайе гуре). Это — тип переменной ро(птее .

По умолчанию в обычных интеллектуальных указателях этот тип относится к обычным указателям. 2. Тяя указаееяя (ро)пгег зуре). Это тип объекта, возврашаемого оператором ->. Он может отличаться от типа хранения, если хранится объект-заместитель (ргоху оЬ)есг), а не сам указатель. (Позднее в этой главе мы рассмотрим пример объекта-заместителя.) 3. Ссмяочяый ашя (ге(егепсе 1уре). Это тип, возврашаемый оператором '. В заключение заметим, что интеллектуальные указатели могут и должны обобшать все три перечисленных типа.

Для этого класс 5магтРтг абстрагирует их в стратегии 5тогаде. Конкретизация класса 5магтРтг не обязана реализовывать их все одновременно. Следовательно, иногда (например, в дескрипторах), стратегия может не определять один из операторов -> и *, либо игнорировать их обоих. 7.4. Функции-члены интеллектуальных указателей Многие сушествуюшие реализации интеллектуальных указателей допускают выполнение операций с помошью функций-членов, например, пег для доступа к объекту, 5ет — для его изменения и Яе1еазŠ— длЯ откаэа От ВЛадеиня.

Вполне естественно инкапсулировать эти функциональные возможности в классе 5магтятг. Однако опыт показывает, что функции-члены не очень удобны для реализации интеллектуальных указателей. поскольку взаимодействие между этими функциями крайне запутанно. Допустим, что у нас есть класс Рг(птег с функциями-членами Асом(ге и яе1еазе.

С помошью функции-члена Асом( ге мы получаем права владения принтером, так что никакое другое приложение ничего напечатать не сможет, а с помошью функции- члена яе1еазе мы освобождаем принтер. Используя интеллектуальный указатель на объект класса Рг(птег, мы обнаруживаем его странную синтаксическую схожесть с конструкциялзи, имеюшими совершенно иную семантику. 5магтятг<Рг1пхег> зряез = ...; зряез->Асоцз геО; // Вступаем по владение принтером ... печатаем документ ...

183 Глава 7. Интеллектуальные указатели зряез->яе1еазеО; // освобождаем принтер зряез.яе1еазеО „ // освобовдаем указатель на принтер Пользователь класса 5вагСРСг теперЬ иысст дастУп к двум совершенно разным множествам функции: функциям-членам объекта, на который ссылается интеллектуальный указатель, и функциям- пенам самого интеллектуального указателя. Выбор этих функций зависит от используемого оператора: точки или стрелки. Программисты на языке С++ вынуждены внимательно следить за тем, какой из опера~оров должен применяться в той или иной ситуации.

Программисты на языке Рааса!, изучающие язык С++, могут даже почувствовать отвращение к необходимости улавливать различия между операциями $ и бй. Однако программисты на языке С++ не имеют права закрывать на это глаза. Они должны выработать в себе привычку легко обнаруживать такие синтаксические различия.

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

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

Перегрузка является важной частью языка и часто применяется в библиотеках и приложениях. Это значит, что программисты на языке С++ привыкли дифференцировать разньге синтаксические формы вызова, например, де1еазе(*зр) и де1еазе(зр). Функциями-членами класса 5вагсясг могут быть лишь конструкторы, деструктор, оператор =, оператор -> и унарный оператор *. Остальные операции, выполняемые классом 5вагсРсг, реализуются с помощью внешних функций. Для простоты класс 5вагсрсг не использует именованные функции-члены. Единственными функциями, имеющими доступ к объекту, на который ссылается интеллектуальный указатель, являются аествр1, пествр1яет', везет и яе1еазе, определенные в пространстве имен.

севр1асе <с1азз т> т* пествр1(5вагсрсг<т>в зр); севр1асе <с1азз т> т-й бествр1яет(5вагСРСг<т>в зр); севр1асе <с1азз т> чогб яезес(5вагсрсг<т>б зр, т* зоцгсе); севр1асе <с1авв т> мого яе1еазе(5вагсрсг<т>в зр, т*б дезсгпасгоп)„ ° Функция аессвр1 возвращает указатель на объект, хранящийся в классе 5вагсРсг, ° Функция бествр1веК возвращает ссылку на указатель, хранящийся в классе 5вагсрсг. Она позволяет изменять этот указатель, поэтому требует особой осторожности. ° Функция яезес возвращает указатель на другое значение, освобождая предыдущее.

° Функция яе1еазе освобождает интеллектуальный указатель, возлагая на пользователя ответственность за управление объектом, на который он ссылался. Реальные объявления этих функций в библиотеке Еой немного сложнее. В них не предполагается, что указатель, хранящийся в классе 5вагсрсг, имеет тип т*. Как указано в разделе 7.3, тип указателя определяется стратегией 5согаде.

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

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

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