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

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

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 197 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 1972018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Конструктор 1о сйгс1е(!з<геата) инициализирует объект данными из своего аргумента типа 1з<геат. Функция пеи с<гс1е() помещается в ассоциативный массив !о тар, чтобы дать знать системе объектного ввода/вывода о новом классе. Например: <о тор [ "1о с<гс1е" ] = а1о с!гс<е::пе<г сис<е< Другие фигуры создаются таким же образом: с1ат 1о <г(апе!е: риЫ<с Тг!апе1е, риЫ<с 1о оЬ)' ( (( ...

Это может и утомить, так что лучше определить шаблон: <етр<а<е<с<авз Т> с<а<в 1о: риЫ!с Т, риЫ!с 1о оЬ!' ( риЫк < 1о* с<вне() солги (гетгп пе<г1о(*<й!з); ) ((замеи<аем 1о ой!':;с!опе() 1о ( и<сеет а ) < (( инициализация из потока ввода в<а<к 1о* пе<г !о (<з<геата з) (ге<игл пе<г 1о (з); ) ((... и уже с его помощью определить 1о сис!е: <уре«е1 1о<С(гс<е> 1о скс<е< Впрочем, нам по-прежнему нужно явно определить То<С!гс!е>:: То(!з<геата), поскольку при этом требуется знать подробности о Сйс1е.

ров Глава 25, Роли классов Шаблон 1о служит примером того, как вписать конкретные типы в классовую иерархию с помощью класса, являющегося узловым в этой иерархии. Шаблон наследует от типа его параметра, чтобы обеспечить приведение типа от 1о оду. К сожалению, из-за этого становится невозможным использовать 1о со встроенными типами: лауре«!е11о<1)аге> 1о аа!е! ~У обертка длн конкретного типа лауре«(е11октз> 1о ии; !! елкою наследование от встроенного типа невозможно Эту проблему можно уладить, введя отдельный шаблон для встроенных типов, или воспользовавшись классом, представляющим встроенный тип (525.10(Ц). Эта простая система объектного ввода/вывода не может делать все на свете, но ее код почти умещается на одной странице, а ее ключевые механизмы имеют множество применений.

Например, их можно использовать для вызова функции, строка с именем которой предоставляется пользователем, и для манипулирования объектамн неизвестного типа при помощи интерфейсов, выявляемых средствами динамического определения типа. 25.5. Операции Самый простой и наиболее очевидный способ определить какую-нибудь операцию в языке С++ — это написать соответствующую функцию.

Однако если операция должна быть отложенной (с)е)ауес)), или ее нужно передать куда-либо для выполнения, или она должна вовлекать в вычисления собственные данные нли комбинироваться с другими операциями (525.10(18,!9)) и т.д. — то возникает желание оформить ее в виде класса, который может выполнить эту операцию, а также предоставить множество других услуг. Очевидным примером здесь являются классы функциональных объектов (классы объектов-функций), используемые совместно со стандартными алгоритмами (818.4), а также манипуляторы, применяемые с потоками !озгееалз (821.4.6).

В первом случае собственно действие вызывается операцией «круглые скобки», а во втором — операциями «и». В случае класса Роли (821.4.6.3) и Магеьт(822.4.7) классы-композиторы (согпрогйгог с!взвел) позволяют отложить операцию до тех пор, пока не будет собрано достаточно информации для ее эффективного выполнения. Простейшая форма класса-операции обычно содержит одну виртуальную функцию (называемую по традиции что-нибудь вроде «до )㻠— «сделай это»); зп ис! Асз!ол ( тзяиа! !п! ао !((!п!) =О; к!егиа! -Асг!ол () ( ) ): Теперь мы можем написать код, например меню, который сможет сохранять действия (операции) для их последующего выполнения, не используя указателей на функции, не имея информации о вызванных объектах, и даже не зная имени операции, подлежашей выполнению.

Например; с!авв и'е!!е !!!е: рио!!с А с!!ол ( Р!!ел 1; 25.6. Интерфейсные классы 909 риЫ!с: !пг «(о й(!пг) (ге!игл 1'.вп1е() .зиссее«(О1) )1 с!азз Еггог геяропяе: риЫЬс А сноп яп !пд п«еяяадег риЫ!с: Еггог гезропзе (сопя! зи!лда я): п«езяаде (з) ( ) пило й(гл1) 1 )1 !пг Еггог гезроте::Ио В(!пг) Яезролзе Ьох аЬ («лезете.

с зи (), "сонг!лис", "сапсе!", "геггу" ) яп!1са («!Ь.де1 гезроте () ) ( сазе О: ге!игл 01 сазе 1: аЬогг() 1 сазе 2: сиггепг ореганоп.ге«!о () 1 ге!игл !1 Аспоп* асг!опя [] = ( леп и'гуе /Ме(!), пеп Еггог геяроте ("уои Ыеп й ада!п" ) ~У ...

)1 Пользователь Аспоп может ничего не знать о производных классах, таких как 1Ьг!1е уя!е и Еггог гезропяе. Описанная техника чрезвычайно мощная и людям с привычкой к функциональной декомпозиции ею нужно пользоваться с известной осторожностью. Если слишком много классов начинают напоминать Аспоп, это может свидетельствовать об ухудшении проекта и крене в нечто излишне функциональное. Наконец, класс может кодировать операцию для выполнения на другом сетевом (удапенном — гегпо(е) компьютере, или для сохранения ее на диске с целью выполнения когда-либо в будущем (925.101181). 25.6. Интерфейсные классы Одними из самых важных являются скромные интерфейсные классы, на которые часто смотрят свысока.

Интерфейсный класс мапо что делает- если бы делал, то не был бы тогда интерфейсным классом. Он просто приспосабливает подачу услуг под «местные» требования. Чистейшая форма интерфейса даже не вызывает генерации кода. Рассмотрим специализацию шаблона Ресгог из 913.5: Глава 2 5. Роли классов гетр!а!с<с!акк Т> с!акк ) есгог<Т*>: рглыаге Уесгог<ыоЫ*> ( риЫгс: Гуредеу Ресгог< ыоЫ* > Ваке; Ресгог() () Ресгог(!пг !): Ваке(!) () Т*а орегагог() (ии к) (ге!игл ге!пгегргег сак«Т*ь> (Ваке::орега1ог() (!) ) 1 ) В...

)' Эта (частичная) специализация превращает небезопасный ) есгог<ыо!И»> в гораздо более полезное семейство векторных классов, безопасных с точки зрения типов. Встраиваемые функции позволяют сделать интерфейсные классы более приемлемыми. Например, здесь встраиваемая функция выполняет всего лишь подгонку типа, так что важно, что она не влечет дополнительных накладных расходов (ни по памяти, ни по производительности). Естественно, абстрактный базовый класс, отражающий абстрактную концепцию и реализуемый конкретными типами (в25.2), тоже является в некотором смысле интерфейсным классом, как и дескрипторные классы из В25.7. Однако здесь мы фокусируемся на классах, которые не выполняют никаких специфических функций, кроме подгонки интерфейсов. Рассмотрим проблему слияния двух иерархий с применением множественного наследования.

Что делать, если имеет место конфликт имен, например, если виртуальные функции, выполняющие совершенно разные операции, имеют совпадающие имена? Рассмотрим, например, игру в «Дикий Запад», где взаимодействие с пользователем осуществляется посредством общего оконного класса: с!акк ИЪВою ( ~У ... ы!ггиа! ыоЫ агою () )1 с!акк СоюЬоу ( В... ы!ггиа! ыоЫйаю(); ): с1акк СоюЬоу югпйою: риЫ!с СоюЬоу, риЫ!с Иг!паою ( В...

): СоиЬоу ю)идою представляет анимацию ковбоя, и через этот класс пользователь осуществляет управление ковбоем. Мы предпочли множественное наследование агрегации членов с типами СоюЬоу и ИиИою, поскольку имеется множество вспомогательных сервисов, определенных как для ИиВою, так и для СоюЬоу. Хотелось бы передавать таким функциям СоюЬоу юиЫою, не требуя от программиста никаких дополнительных действий. Это, однако, приводит к проблеме определения в классе СоюЬоу юГпгуою версий функций СоюЬоу::г!гаю() и ИЧп(!ою::Игаюы. 25.б. Интерфейсные классы 911 сйззз ССоюЬоу: риЫ(с Сом Ьоу ( риЬИс: Ызаиа! йи сою агою () = О; юЫагаю() (сом агою(); ) )' У интерфейс к СоюЬоу, переименовгивающий агою() УУ замещаем Союйоу:Ыгаю() с)авв И гРЫв(ою: риЬИс Иг(паою ( риЫ(с: ей!ив! )и! ю)п Огаю () = О; воЫ агою() (ю(п Й'аю(); ) )' УУ интерфейс к И')пйою, переименовывоющий йгаю() УУ замещаем и'(паою: пугаю() Теперь мы можем составить СоюЬоу ю)пНою из интерфейсных классов ССоюЬоу и ИгИг)пдою, и заместить сою агою() и н!и в(гаю(), чтобы добиться желаемого эффекта: с(авв СоюЬоу ю(паою: риЫ(с ССоюйоу, риЫ(с И "гР(пйою ( УУ...

юЫ сон Йан (); юЫ ннп Йан (); ) Заметим, что проблема оказалась серьезной по той причине, что две функции с одинаковыми именами имели аргументы одинакового типа. Если бы их аргументы различались, обычные правила перегрузки гарантировали бы различение функций с одинаковыми именами. Для каждого способа применения интерфейсных классов можно было бы, в принципе, представить некоторое расширение языка, которое выполняло бы необходимое приспособление чуть более элегантно и эффективно. Однако каждый вариант применения интерфейсных классов встречается не столь уж и часто, так что сопоставление каждому из них дополнительных языковых конструкций внесло бы в язык ненужную сложность.

Кроме того, столкновение имен при слиянии двух классовых иерархий тоже нельзя назвать обычным явлением (по сравнению, например, с тем, как часто программист пишет классы), и, к тому же, оно имеет место лишь при объединении иерархий из разных предметных областей — таких как игры и системы оконного интерфейса. Слияние непохожих друг на друга иерархий — во- В СоюЬоу ю)пв(ою может быть только одна функция Йаю(). Но поскольку сервисные функции манипулируют объектами И1пЫою и СоюЬоу, ничего не зная о СонЬоу ю(пв(ою, последний должен заместиты(гаю() и для класса СоюЬоу, и для класса Ийв(ою. Замешение их обеих единственной функцией будет неправильным, так как, несмотря на одинаковое название это разные функции.

Наконец, хотелось бы получить однозначно различающиеся имена для унаследованных в СоюЬоу юзпв(ою функций СоюЬоу:: в(гаю() и Япе(ою::г!гаю() . Для решения проблемы введем по дополнительному классу для СоюЬоу и для Изпе(ою. Эти классы введут два новых имени для функций Нгаю (), а также заместят Йаю() при наследовании от Союйоу и Иггпв(ою так, что вызываться будут функции с новыми именами; 912 Глава 2 5.

Роли классов 25.6.1. Подгонка интерфейсов Основное применение интерфейсных функций состоит в подгонке интерфейса под ожидания пользователей так, чтобы сконцентрировать в рамках интерфейса весь код, который иначе был бы разбросан по всей программе. Например, отсчет индексов в стандартном контейнере гес(ог начинается с нуля.

Если пользователи не хотят, чтобы индексы занимали диапазон от О до з!хе-1, они должны приспособить вектора для своих нужд. Например: гой(1'( ) ( гес(ог г<!л(> (10) ( // диапазон ГО:91 //делаем вид, что диапазон !1(10]( 1ог(йм (' = 1; 1<=10; (пп) ( г[(-1) = 7( /У ... У лодправлнем инде«с Еще лучше снабдить вектор произвольными границами; с!азз гес(ог: риЫЬ( гес(ог<тг> ( (л( !Ь; риЬнс: нес(ог(!п(!он, т(ЫОЫ ( гес(ог<т(> (Ь!вй-(о(г+1) (!Ь=!о(г() !л(ь орега(ог[) (!и(() (ге(игп гес(ог<(п(>: (прего(ог[) (1-Й) () т( !о(в() (ге(игл !Ь( ) т( Ь(йй () (ге(игл !Ь-'з!се () -1; ) )( Класс 1(ес(ог можно использовать следующим образом: го!(( а () ( нес(ог г (1, 10) //диапазон /1(101 обще столь непростая задача, что разрешение конфликтов имен далеко не единственная возникающая при этом проблема; есть еще разные способы инициализации, разные стратегии обработки ошибок и управления памятью и т.д.

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

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

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

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