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

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

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

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

Ниже приводится модифицированный класс Гповярагсбег (изменения выделены полужирным шрифтом). теар1ате < с1аяя ваяеьйв, с1авя ваяекбя = ваяеьйв, кеяи1гтуре = чо1д, геар1аге <с1авв, с1аяя> с1аяя савОпдро11су = оупаа1ссавгег > с1аяя Гипсгого1врагсйег геар1аге <с1аяя воаеьйв, с1авя воаекйя, с1аяя Гип> чо1о Аоо(сопят Гила бип) с1аяя Абаргег: риЬ11с Гипстогтуре::тар1 Гип Фип ; чвггиа1 кеви1гтуре орегагог()(ваяеьйвй 1Ьв, вавекйяб гйв) гегигп Уип ( савгзпдро1зсу<воаегйя, вавегйв>::савг0Ьв), СавОпдро11су«яоаеКЬя, Ваяеййя>::Саят(гйв); 305 Глава 11. Мультиметоды как и раньше Ьаскяпд .Мд<5ошеьнз, 5ошеаба>( рцпстогтуре(пеш лдартег(Тип)); )' Обратите внимание на то, что по умолчанию стратегия конкретизируется классом пупами ссазт. В заключение попробуем воспользоваться стратегией приведения типов для доспокения интересных результатов.

Рассмотрим иерархию классов, изображенную на рис, 11.4. Одна ее часть не использует "бриллиантовое" наследование, поэтому для нее можно смело применять оператор зтат)с сазе. Например, оператор зтаттс саят успешно преобразует тип 5Ьареа в тип тг1 апо1 еб. С другой стороны, оператор зтат1с сазе нельзя применять для приведения типа 5Ьарей к типу яестапо1ей и любому производному от него типу, здесь нужно использовать оператор дупапп' с сазе.

Рис. П.4. Иерархия классов, содсрхсаиСая "бриллиантовую" насти Допустим, что мы определяем свою собственную стратегию приведения типов для данной иерархии классов. Назовем ее 5орегсазт. По умолчанию в ней можно применять оператор с1упаЫ с сазт, специализируя эту стратегию для отдельных ситуаций. тешр1ате <с1авэ то, с1аэв Ргош> зтгист 5Ьаресазтег зтат1с той сазе(ягой оЬ)) гетцгп дупаш1с сазт<тоб>(оЬЗ) тешр1ате<> с1аээ 5Ьаресазтег<тгтап91е, 5Ьаре> ( зтат1с тгтапо1еб Сазе(5Ьареб оЬ)) гетцгп зтат1с сазе«тгзапй1ей>(оЬ)); ) 306 Часть 11.

Компоненты Теперь мы во всеоружии — когда можно, используется быстрое приведение типов, а в остальных случаях — безопасное. 11.10. Мультиметоды с постоянным временем выполнения Статические диспетчеры слишком ограничены, а динамические слишком медленны. Что делать, если нам нужен быстрый и масштабируемый диспетчер? В этом случае нужно переработать свои классы, открыв их для вмешательства двойного диспетчера. Эта возможность открывает новые перспективы.

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

Найдя пересечение двух типов, мы отыщем нужную функцию. На рис. 11.5 показана двойная диспетчеризация для двух иерархий классов — 5паре и огавоеч1се. Обработчиками являются функции рисования, которые знают, как изобразить объект класса в)заре с помощью объекта огавупооеч1 се. Окружность Эллипс Треугольник Примоугсльни Рис. 1Д5. Дислетссризаииа иерархий Басра и Рганйавосысс Нетрудно логадаться, что лля достижения постоянного времени поиска точки на плоскости следует использовать инлексированный доступ к элементам двумерной матрицы. Идея возникает немедленно; каждый класс должен ассоциироваться с уникальным целым числом, представляющим собой индекс в матрице диспетчера, Доступ к этому числу из любого класса должен осуществляться за постоянное время.

Для этого можно применить виртуальную функцию. При двойной диспетчеризации выюва диспетчер извлекает два индекса из двух обьектов, обращается к обработчику„записанному в матрице, и активирует его. Это связано со следующими затратами: лва виртуальных вызова, одна операция индексирования матрицы и вызов функции через указатель на нее. На это уходит постоянное время. 307 Глава 11. Мультиметоды На первый взгляд идея прекрасна„однако не все ее детали легко реализовать. Например, поддержка индексирования скорее всего окажется неудобной.

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

Виртуальная функция должна возврашать ссылку на это целочисленное значение, позволяя диспетчеру изменять его в ходе выполнения программы. При добавлении в матрицу нового обработчика диспетчер лолжен проверить его идентификационный номер. Если он равен — 1, ему следует присвоить следуюший доступный индекс матрицы. Ниже приведена основная часть реализации — макрос, который следует поместить в каждый класс, входяший в иерархию. ябегт'пе смгьвмвнт тиовхлвсв сьлвб(воиес1азз) зсас1с 1псв аесс1аззтп0ехбсас1сО'т (~ зсас1с тпс тпдех = -1; гесогп т'пдех; т чт гсца1 т'псб бесс1аззспдехО'т аззегс(сурет'д(*сйт'з) == сурет'0(боиеС1азз)):т гесигп бесс1аззспдехвсаст'сО;'т Этот макрос следует поместить в открытый раздел каждого класса, для которого предусматривается множественная диспетчеризация.а Шаблонный класс ваз1сгазсптзрассйег предоставляет те же функциональные возможности, что и прежний класс вазтсотзрассйег, используя другие механизмы хранения и извлечения ланных.

сеер1асе < с1азз вазеьйз, с1аав вазеяйз = вазесйз, сурепаие яеао1стуре = чо16, сурепаие са11Ьасктуре = аези1стуре (*)(вазеьйзе, вазеяйзе) > с1ааа вазт'сгазсот'зрассйег ( суредеГ зсд:чессог<са11Ьасктуре> яои; Суребеб зсб::чессог<яоп> масгтх; масг1х са11Ьаскз тпс со1омпз рОЬ)т'с: вазтсгазсп1зрассйегО : со1ияпз (О) О сеяр1асе <с1азз боиеьйз, ВовеаМ> чей лбд(са11Ьасктуре рсдрп) ( 1псй т'бхььз = бояеььз: >весс1аззспдехбсаст'сО; 1Е (Ихсйз < О) а Именно множественная, а не только двойная.

Это решение легко обобшнть на случай множественной диспетчеризация. 308 Часть П. Компоненты [ са11Ьас!сз .розЬ ЬасМ(аоиО); 1дхьбз са11ЬасМз .з1аеО - 1; ) е1зе 1г (са11ЬасМз .з1аеО <= Ихьбз) [ са11ЬасМз .гез1ае(Ихьйз + 1); ) аошб тббзяош са11Ьаскз [1дхьбз]; 1пт 1дхяьз Бошеяьз::сетс1аззтпдехвтат1сО; 1т (1дхабз < О) [ тЬ1заош. гез1ае(++со1ишпз ); Ихяба = тЬ1заош.з1геО - 1; е1зе 1У (тЬ1зяош.з1аеО <= 1бхабз) тЬ1зяош.гез1ае(здхяЬз + 1) ) тЬ15аош[1с!хябз] = ряцп; ) Матрица обратных вызовов реализуется в виде вектора, состоящего из векторов типа марредтуре.

Функция ваз1ссазго1зрагсбег::лбд выполняет следующую последовательность действий. ° Извлекает идентификационный номер каждого класса, вызывая функцию Сетс1аззтпдехвтат1с. ° Выполняет инициализацию и настройку, если один или оба индекса не были проинициалнзированы. Для неинициализированных индексов функция Аоо расширяет матрицу, добавляя в нее дополнительный элемент. ° Вставляет обратный вызов в соответствующую позицию матрицы.

Переменная-член со1щапз подсчитывает количество столбцов, добавленных к данному моменту. Строго говоря, эта переменная излишня. Вычисление максимальной длины строки в матрице приведет к тому же результату. Однако переменная со1- ишпз добавлена для удобства. Теперь легко реализовать функцию вазбссазто)зратсбег::со. Основное отличие от предыдущей реализации заключается в том, что теперь функция со использует виртуальную функцию сетс1аззтпдех. тешр1ате <...> с1азз ваз1сгазто1зратсйег как и раньше яезо1ттуре со(вазеьбзй 1Ьз, вазеабзб гбз) 1птй 1дхьЬз = 1Ьз.сетс1аьатпбехО; 1птй 1дабз = гба.сетс1аззтпдехО; 1У (1бхьбз < 0 !! 1дхябз < 0 1г!хьбз >= са11Ьас!~з .з1геО !! 1дхабз >= са11Ьасз [1дх~бз].з1аеО !! са11Ьасйз [ИхьЬз][ИхяЬз] == О) ... обработка ошибок ...

Глава 11, Мультиметоды гесигп са1 1Ьас(сз (1охьйз) (Ихяйз) . са1 1Ьас1с (1Ьз, гба) ) Подведем итоги. Мы опрелелили диспетчер, используюший матрицу. Он позволяет выполнить обратный вызов на постоянное время с помошью доступа к целочисленному индексу каждого класса. Кроме того, он выполняет автоматическую инициализацию данных (индексов, соответствуюших классам), Пользователи класса ваз(сгазсо(зрасснег должны добавить в каждый класс, используюший диспетчер, одну строку макроса тмрьдмвнт тновхлвьв сьлвв(класс).

11.11. Классы Ваз!с0!зра1сйег и Ваз)сраз10!зра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пйпо11су = оупаппсСазсег, сеер1асе <с1азз, с1азз, с1азз, с1азз> с1ава о1зрассйегвас(сепд = ваз(со(зрассйег > с1азз гпо1зрассйег; // аналогично классу гопссогоЗзрассйег Сами классы практически не изменяются. Уточним требования, предъявляемые к стратегии о1зрассйегвасйепд.

Прежде всего, очевидно, что эта стратегия должна быть шаблонным классом с четырьмя параметрами. Семантика этих параметров такова. ° Тип левого операнда. ° Тип правого операнда. ° Тип значения, возвращаемого обратным вызовом. ° Тип обратного вызова. 310 Часть П. Компоненты В табл. 1!.1 класс васйелдтуре представляет собой конкретизацию диспетчера, а объект Ьасйнпд — переменную этого типа. Таблица содержит функции, о которых мы не упоминали, — не беспокойтесь. Полное описание диспетчера должно солержать функции удаления обратных вызовов и "пассивного" просмотра без обращения к обратным вызовам. Они реализуются тривиальным образом.

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

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

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