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

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

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

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

Иными словами, он преобразовывает типы аргументов вазесбз и вазеяба в типы 5ошесвз и 5оаеяба (зтпт ПРоцесс называетсЯ одалтациеЮ. сешр1асе <с1азз вазеьбз, с1авв вазеябз = вазесвз, яези1стуре = ио1д> с1авв гипссого1зрассвег с как и раньше сешртасе <с1азз 5оаеьбз, с1азз 5ошеабз, с1азз гип> ио1д лдд(сопзс гипб 1ип); ( суредет Гипстогтшр1<яези1стуре, тугеьхвт 2(вазеьбзб, вазеябзб)> гипссогсшр1туре; с1ава ддарсег : риЬ11с гипссогсшр1туре ( гип Гип и1гсиа1 яези1стуре орегасорО(вазеьбзй 1Ьз, вазеявзб гбз) гесигп тип ( дупаштс .сазс<5ошеьбзб>(1бв), дупавдс сазс<5ошеябзб>(гбз)); и1гсиа1 гипссогсар1туре> с1опеОсопзс ( гесигп пеп ддарсег; риЬ11с: ддарсег(сопвс гипб Фип): тип (Гип) () ); ЬасКепд .ддд<5ошесбз, 5оаекба>( гипссогтуре(гипссогтшр1туре*)пеш ддарсег(1ип)); Класс адарсег делает то же, что и трамплннная функция.

Поскольку функтор имеет состояние, класс ддарсег содержит объекты класса гип — для трамплинной функции зто было невозможно. Функция-член с1опе, имеюшая очевидную семантику, нужна для класса гипссог. Функция гипссогспзрассбег: гддд имеет широкое применение, Ее можно использовать дая регистрации не тальки указателей на функции, но и почти любого функтора, даже обобшенного. Для этого нужно лишь, чтобы тип гип в функции ддд допускал применение 301 Глава 11.Мультимвтоды оператора О с аргументами типов 5овеьпэ и 5овеяпэ, а тип возврашаемого значения позволял преобразование в класс яеьц1ттуре. В следуюшем примере показано, как регистрируются два разных функтора для объекта яипстогпз врат слег.

туреде1 яопстогпзэрасспег<5паре> пзэратспег; этгоет Натсйпестапд1еяо1у ( чеза орегатог(яестапй1ее г, Ро1уб р) ( ); этгосс натсМ11зрэеяестапй1е чей д оре гасо г(511 з раей г, яестапп)еб р) ( озэратспег Мзр; Нар.лбд<яестапо1е, Ро1у>(натсйяестапй1еяо1уО); Н эр.дай<511(рве, ЯЕСтапй1е>(натсй511(рэеяестапй1еО); Два этих функтора никак не связаны между собой (хотя являются потомками одного и того же базового класса). Они лишь реализуют оператор О для типов, которые они должны обрабатывать. Реализация симметрии класса вцпстогИ эратспег аналогична реализации симметрии класса гппзэратспег.

Функция вцпстогп(эратспег::ланд определяет новый объект яечегэелбартег, который выполняет приведение типов и меняет порядок вызовов. 11.9. Преобразование аргументов: в1а1(с сав1 или бупат1с савЛ Ранее для приведения типов всегда применялся безопасный оператор дупапп'с саэт. Однако эта безопасность достигалась за счет снижения эффективности программы. В момент регистрации мы уже знаем, что наша функция или функтор будут активированы для пары конкретных, точно известных типов. Таким образом, при обнаружении элемента, храняшегося в ассоциативном массиве, механизму двойной диспетчеризации известны фактические типы.

Таким образом, излишне повторять проверку типов с помошью оператора булав(с савт, если простой оператор этатзс саэт позволяет достичь тех же результатов за меньшее время. Однако сушествуют две ситуации, в которых оператор этат(с сазе может оказаться неприемлемым, вынуждая прибегнуть к динамическому приведению типов с помошью оператора булав(с саэт. Первая ситуация возникает при использовании виртуального наследования. Рассмотрим следуюшую иерархию классов. с1аьв 5Паре ( с1аеа яестапо1е : т гтоа1 роЫ (с 5паре ( с1азэ яоопдедвпаре : чз гтоа1 роЫ (с 5паре ( с1авв яоипдедяестапй1е : риЫ (с яестапд1е, риЫ( с яоипдедвйаре ( На рис. 11.2 показаны отношения между классами, входяшими в эту иерархию.

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

Однако, если заменить оператор дупат1с саэт оператором зтат(с саэт, при попытке привести тип элард к любому из типов яестапо1еб, яоцпдеЖЬареб или коппс)ее(яестапо1еб возникнет ошибка компиляции. Это происходит потому, что виртуальное наследование отличается от простого наследования. Виртуальное наследование предоставляет средства, позволяющие нескольким производным классам совместно использовать один и тот же объект базового класса.

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

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

Короче говоря, для иерархий, использующих виртуальное наследование, следует применять оператор дупат1с саят. Вторая ситуация возникает, когда иерархия классов использует простое (даже не виртуальное) множественное наследование. с1азз зЬаре ( ... ); с1аээ яестапо1е : роЫ (с Буаре ( с1аээ яоцпдеЖЬаре: роЫ(с вбаре ( Глава 11. Мультимвтоды зоз с1азз йоип6е6йестапо1е : риЬ11с йестапо1е, риЬ1(с йоцпбе65Ьаре ( На рис. 11.2 показаны отношения между классами, входяшими в эту иерархию. Рис. П.З.

"Бриллиантован" иерархии нлассов, иснользующан невиртуальное наследование Несмотря на то что форма иерархии осталась прежней, структура объектов значительно отличается от предыдушсй. Объекты класса йоцп6е6йестапо1е теперь могут быть двумя разными подобъсктами типа 5Ьаре. Это значит, что преобразование объекта типа йоцп6е6йестапо1е в объект типа 5Ьаре становится неоднозначным. Какой тип 5Ьаре имеется в виду — тот, который относится к типу йоцп6е65Ьаре, или тот, который связан с типом йестапд1е? Аналогично мы не можем выполнить даже статическое приведение типа 5Ьареб к типу йоип6е6йестапо1еб, поскольку компилятор не знает, какой из полобъектов типа 5Ьаре имеется в виду.

Что делать? Рассмотрим следуюший код. йоцп6е6йестапо1е гоип6йест; йестапо1еб гесс = гоип6йест; // Однозначное неявное преобразование 5Ьарей зЬаре1 = гесс; йоип6е65Ьареб гоцп65Ьаре = гоип6йест; // Однозначное неявное преобразование 5Ьареб зЬаре2 гоип65Ьаре; 5овеп(зратсЬег 6; 5Ьареб вовеотЬег5Ьаре а ...; 6.бо(зЬаре1, зожеотЬег5Ьаре); 6.бо(зЬаре2, зовеотЬег5Ьаре); Здесь важно то, что диспетчер использует оператор 6упав1с сает для преобразования типа 5Ьареб в тип йоцп6е65Ьарей. Если попытаться зарегистрировать трамплинную функцию для такого преобразования, возникнет ошибка компиляции, Если диспетчер использует оператор динамического приведения типов, никаких проблем вообше не возникает. Оператор 6упав1с сазт<йоцп6е6йестапо1еб> применяется к любым подобъектам базового класса 5Ьаре, позволяя получить правильный объект.

Очевидно, что лучше динамического приведения типов ничего нет. Оператор 6упав1с сает разработан для получения правильных объектов в иерархии классов, независимо от сложности их структуры, 304 Часть й. Компоненты Итак, оператор ягаОс саят нельзя применять для двойной диспетчеризации иерархии классов„в которую базовый класс входит несколько раз, независимо от того, виртуально наследование или нет.

Может показаться„что оператор дупаа1с саят следует применять при создании любых диспетчеров. Однако существуют два дополнительных момента. ° Очень немногие реальные иерархии классов используют "бриллиантовую" форму наследования. Такие иерархии слишком сложны, и проблемы, которые они порождают, перевешивают их достоинства. Поэтому разработчики обычна избегают применять такие иерархии классов. ° Оператор дупаа1с саят выполняется намного медленнее, чем оператор ягат1с саят. Его мощь достигается за счет снижения быстродействия.

Многие клиенты работают с очень простыми иерархиями классов и хотят, чтобы их программы работали быстро. Использование оператора дупаа1с саят ставит клиентов перед выбором: разработать совершенно новый диспетчер или внести изменения в библиотеку. В библиотеке )о)и реализована стратегия саяг1пдро11су. Она представляет собой шаблонный класс с двумя параметрами: исходный и результирующий типы. Стратегия содержит единственную статическую функцию саят. Ниже приводится определение класса рупаа1ссавг. теар1аге <с1аяя то, с1аяя Ггоа> ятгисг оупаа1ссаягег ятаг1с той саят(ггоаа оЬ)) ( гегигп бупаа1с саят<топ>(оЬ)) Диспетчеры Гпо1ярагсйег и Гипсгого1ярагсйег используют стратегию саят1пдГо11су, следуя принципам, сформулированным в главе 1.

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

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

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