Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 197

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 197 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 1972019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Например; // записать в файл с1азз КаМере(е: риЫЕсАсйоп ( Ейебд"; риЫ1а !л! Йо !Е (епЕ) ( гегигпУ:еогЕЕе ().зиссеед (); ) с!азз Еггог гезролзе: рибйсАсйоп ( О ответ но ошибку кзггееи теккаие; !!сообщение рибйс: Еггог гезропке(соле!к!с!пайк); тезкаде (к) Ц Елг еЕо и ((пЕ), !пЕЕггог гекропкездо и (тЕ) ( Еезропзе боздб(теккаие.с згг(), продолжить", отменить',"повторить'); зтйс1е (еЕЬ уе1 гезропзе ()) ( сазе О: геЕигл О, сазе 1: аЬоеЕ(), саке 2: сиггепЕ орегайол.гедо (); ее!игл 1; ) Асйоп' асйолз() = ( Е'ее действия и еиз Кгг(ге(71е (!), пет Еггог гезролзе ("вом снова не повезло"), Пользователь класса Асйол может совершенно ничего не знать о производных классах, таких как КпЕе Ее!е иЕггог гезролзе.

Это — мощная техника, н людям, привыкшим к функциональной декомпозиции, следует применять ее с известной осторожностью. Если слишком много классов ста- 855 25.5. Интерфейсные классы новятся похожими на Ас((оп, может оказаться, что весь проект системы ухудшился, превратившись в нечто излишне функциональное. И, наконец, класс может кодировать операцию для выполнения на удаленной машине или для хранения, чтобы выполнить ее в будущем. 25.6. ИнтерФейсные классы Одна из самых важных разновидностей классов — зто скромные интерфейсные классы, на которые, как прави.ло, смотрят свысока. Интерфейсный класс мало что лелает— если бы делал, то не был бы интерфейсным классом. Он просто приспосабливает внешнее представление некоторых услуг к местным потребностям.

Поскольку в принципе невозможно все время одинаково хорошо удовлетворять все потребности, интерфейсные классы очень важны для того, чтобы позволить совместное использование без необходимости надевать на всех пользователей одну смирительную рубашку. Совершенно чистая форма интерфейса даже нс вызывает генерирования кода. Рассмотрим специализацию контейнера Уес(ог из 5 13.5: (етр!а(е«с(азз Т с(азз Тес(вг<3"в.рниа(е Уес(ог'ио!с('> ( риб((с. (урес(е~ Уев(ог Вазе; Уес(ог () () Уев(о г (!п! !): Вазе (4 ( ) Т'й врега(ог() ((и! й ( гепигп ге(п(егрге! саз! Т'й> (Вазесврега(огЦ (!)); ) 77-. с(аьв (У(пс(ою ( П-. и(г(иа! иои(йаж (), )' О вывести образ Эта (частичная) специализация превращает небезопасный Уес(ог«иоЫ> в более полезное семейство векторных классов, безопасных с точки зрения типов.

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

Рассмотрим проблему слияния двух иерархий, с использованием множественного наследования. Что можно сделать, если имеет место конфликт имен, то есть в двух классах виртуальные функции, выполняющие совершенно разные операции, имеют одинаковые имена? Например, рассмотрим видеоигру «Дикий Запад>, где взаимодействие с пользователем осуществляется через общий оконный класс: Глава 25. Роли классов 858 с1азз Соибоу ( 0- пг!иа! иоЫ с!гав (); // вынуть револьвер из кобуры с1азз СогвЬоу гв!ас!оил: риЫлс СотЬоу, риЫге 1Р1па!озв ( //- ); Союбоу ю!пс!ою представляет анимацию ковбоя в игре, и через этот класс игрок осуществляет управление ковбоем. Мы бы предпочли множественное наследование, чем объявлять %!пл!ою илн СоюЬод членом, поскольку есть много служебных функций, определенных и для УПпг!ою, и для СоюЬоу.

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

Чтобы решить эту проблему, пам нужно ввести по дополнительнозиу классу для Союбоу и для )Гл!пс(ою Эти классы вводят два новых имени для функций с!гаю () и гарантируют, что вызов функций с! ав () в классах СоюЬоу и Ф!пс(ою вызовет функции с новыми именами: // интерфейс кСотЬоу с переил~енованной О ат() с!изз ССотЬоу: риЫЫ СотЬоу ( риЫ1с.

Гмг1иа! и! согв с!гам () = О; оо!ил!гат () (сот Йгат();) ,)' // замеи(ение Сотаоугж аи // ингоерфеис к й)ал!от с аереил~енованной дгаи !) с1азз П'1Гл!лЫоин риЫ!с (гл!нс!от ( риЫ1с. олг1иа! !а! гв!и с!гаил () = О; ооЫ с(гам () ( ол!и с(гам (); ) //вален)ение Фтл!отнл!гаи с!азз СотЬоу тиЫоин рибйс ССотЬоу, риЫлс 1Ле!ас!от ( /Г иоЫсот с!гам(); ооЫт!а дгат(); Отметим, что зта проблема была серьезной только потому, что две функции с(гаю () имели одинаковый тип аргумента. Если бы типы аргументов различались, обычные Теперь мы можем составить СоюЬоу ю!пс!ою из интерфейсных классов ССоюбоу и )У ьг!пс(ою и заместить соил с)гаги() и ют с!гаю (), чтобы добиться желаемого ре- зультата: 857 25.8.

Интерфейсные классы 25.6.1. Приспосабливакзщие интерфейсы Главное применение интерфейсных функций — приспосабливание интерфейса, чтобы он лучше соответствовал ожиданиям пользователей, путем перемещения в интерфейс кода, который иначе был бы разбросан по всей пользовательскоп программе. Например, отсчет индексов в стандартном векторе оес1ог идет от нуля. Пользователи, желающие, чтобы их вектора индексировались пе от 0 до з!ге-1, должны приспособить вектора для своих целей. Например: оо!йл () ( л дианазон [дсй) оес!ого<!н!' (1т' лллл нритворнлмя, нто о имеет диапазон [1:!О) 1ог (!н!1=1; !<=10;гь+)( о[л-1] = 7; лллл не забудьте подправить индекс Лучшим решением является введение вектора с произвольными границами: с!азз Тес!ог: риЬ!!с иесгог<т!ь ( !и! 1Ь; риЬ!!с. Уес!ог (!и! !от, 1п! Ь!иЬ); иес!ог<ш! (Ь!иЬ-1оигь1) (1Ь=1оис ) правила перегрузки гарантировали бы, что проблем не возникнет, несмотря нато, что несвязанные между собой функции имеют одно и то же имя.

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

Его можно использовать не только для замены имев, но также для изменения аргументов и типов возвращаемых значений, для введения проверки во время выполнения и т. и. Поскольку функции ССошЬоусс(гаш () и [й(Ь!паош::й.аш () переадресуют свой вызов виртуальным функпиям, их нельзя оптимизировать простым встраиванием. Однако компилятор может распознать в них просто переадресующнс функции и оптимизировать, убрав нх из цепочки вызовов.

Глава 25. Роли классов 858 !и !8, прея агог() (т Е 1) ( ге!игл иесЕог<ел 1>: аре гага! [) (е — !6); ) !еег 1ош () ( ге1игл 16; ) еле 6(я/е () ( ге!игл!6<.е!ее ()-1, ) )' ЪесЕогможпо использовать следующим образом: соЫд() ( 1гесгог с (1, 10), //диапазон(1:!О) Еог (ии1=1, е<!0; 1-><-) ( с(!)=7; О..' ) 1етр!аее<!пг 1оа, Еп1 6!а6> с1аее йапде ( !п1 са1; риЫЕс. с(аез Еггог(); // класс исключений йапае (тЕ !) (Аееегг<Еггсг> (1ош<=!М1<6!26); са1= !; ) //ся. 2" 24.2>?.2 йапие арегагог= (Епг к) ( ге!игл "161е=йапОе й); ) арегаЕсг т1 () ( ге!игл иаЕ, ) //" сс!<Е/(йапие<2, 17>); ссЫ я (йапае<-10, 10>); соЫ Ь (ел1х) ( йапде<0, 2001> ! = х; тг!! =е; // лЕсжет сгенерировать йапаенЕггсг У(2); Х(1~; // ге нерир!Еет йапде нЕггсг Это не вызывает никаких затрат по сравнению с предыдущим примером.

Ясно, что версия Ъесгог легче читается и пишется и менее подвержена ошибкам. Интерфейсные классы обычно невелики и (по определению) мало что делают. Однако они становятся необходимы, когда программные продукты, написанные в разных традициях, должны объединиться, поскольку тогда требуется посредник между разными стилями написания кода. Например, интерфейсные классы часто используются для того, чтобы обеспечить интерфейс С+е к программам па других языках, а также чтобы изолировать прикладной код от подробностей библиотеки (оставив открытой возможность замены одной оиблиотекп другой). Другое важное применение интерфейсных классов — предоставление проверяемых и ограниченных интерфейсов.

Например, довольно часто предполагается, что целые переменные имеют значения в определенных пределах. Это можно гарантировать (во время выполнения программы) простым шаблоном; 25.7. Вспомогательные классы а(-71; д11оО~; ) ~/ генерируеп~ йипдепЕл ог Шаблон Рапде ле~ко расширяется для работы с диапазонами произвольных скалярных типов Я 25.1017]), Интерфейсный класс, который контролирует доступ к другому классу или приспосабливает его интерфейс, иногда называют оболочкой.

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

Тип файла
DJVU-файл
Размер
10,02 Mb
Тип материала
Высшее учебное заведение

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

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