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

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

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

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

Иногда нам нужно знать точный тип объекта для выполнения некоторых действий с полным объектом (а не с отдельными его фрагментами базовых типов). В идеале такие действия должны выполняться виртуальными функциями, когда знать точный тип объекта нет необходимости. Но в некоторых случаях невозможно построить общий интерфейс ко всем типам объектов, и экскурс по типам объектов становится неизбежным (515.4.4.1).

Еше одним, более простым случаем является ситуация, когда имена типов нужно выводить для диагностики работы программы: 15.4. Механизм РТТ( (Рцп-Т(гпе Туре (п1оггпабоп) 503 Рассмотрим вопрос о.том, как приложение или инструментальное средство может сделать информацию о типе доступной пользователю на этапе выполнения программы. Допустим, что у меня есть инструментальное средство, генерируюшее раскладку объектов каждого используемого класса. Я могу поместить эти описания в контейнер типа пзар, чтобы пользовательский код получил доступ к этой информации: тарсзп(пя, йауоиг> 1ауоиг гаЫе; го!чЦ'(В* р) ( йауои!Еп =!ауоиг гаЫе [~реЫ (*р) . лате () ]; // используем х ) Кто-нибудь еше мог бы предоставить информацию совершенно иного характера: Пгисг Т1 ег! ( Ьоо1 орегагог() (соле!гуре !и!о* р, соле! (уре 1л!о* о) (ге!игл "р==*е! ) )' мгисг Т1 'пав!г ( Ы! орегагог() (соле! (уре 1пуо* р); )' // вычисляет *лазо-значение (З!7 6 2 2) йазл тор<сапы гуре !л!о*,1соп, Т1 лаз!г, Т1 егр !сои гаЫег //З!7.6 гоЫВ(В* р) ( 1сопь 1 = (соп гаЫе [ьгуреЫ(*р) ); // используем ! ) Такие варианты связывания результатов операции !уреЫ с информационными структурами позволяют разным людям или инструментам независимо предоставлять разную информацию о типах: 1ауои! гаЫе Ш раскладка объекта зсоп заЫе: представление типа в виде иконки Это очень важно, так как вероятность того, что всех устроит одинаковая информация о типах, близка к нулю.

504 Глава 15. Иерархии классов 15.4.5. Корректное и некорректное применение КТТ! Информацию о типах на этапе выполнения следует использовать только в случае реальной необходимости. Статическая (на этапе компиляции) проверка надежнее, влечет меньшие накладные расходы и приводит (как правило) к более структурированным программам. Например, можно использовать КТТ1 и лля написания тонко замаскированных ззв!гсА-операторов: гУ неразумное применение )(ТТА гоЫ гога(в (сопле БАареа г) ( Ц (гуреЫ(г) ==(уреЫ(с!гс(е) ) ( У ничего не делаем е!зе (Т (гуреЫ(г) ==гуреЫ( Тг(апфе) ) гу вращаем треугольник ) е!зе Ь (ГуреЫ(г) ==Гуремсудиаге) ) ( У вращаем квадрат ) ,(г ... ) Применение йупатзс сазе вместо ОреЫ значительно улучшит этот код.

К сожалению, это не надуманный пример — такой код действительно пишется. Для многих людей, использовавших языки С, Рааса!, Мог(ц1а и Ада, очень трудно отказаться от написания кода в виде ззвйсА-операторов. Этому следует сопротивляться. В большинстве случаев, когда в зависимости от типа требуется осуществить вариативное поведение кода, вместо КТТ1 лучше использовать виртуальные функции (52.5.5, 512.2.6). Примеры надлежашего применения КТТ1 возникают, когда сервисный код выражен в терминах некоторого класса, а пользователь хочет добавить функциональность посредством наследования. Хорошей иллюстрацией сказанному может служить семейство классов Тга! Ьох из В15.4. Если бы пользователь хотел и имел возможность модифицировать библиотечные классы, скажем ВВп!тлоп, необходимость в КТТ1 отпала бы. В противном случае этот механизм нужен. Даже если пользователь хочет модифицировать базовые классы, в такой модификации имеются свои проблемы. Например, возможно пришлось бы писать фиктивные реализации виртуальных функций в классах, для которых они не нужны (или не имеют смысла).

Эта проблема обсуждается более подробно в 524.4ун Применение КТТ1 для реализации простой системы объектного ввода/вывода рассматривается в 525.4.1. Люди, имеюшие большой опыт работы с языками Бша!1(а!й или (лзр, сильно опираются на динамическую проверку типов и испытывают искушение использовать КТТ! совместно с чрезмерно общими типами.

Рассмотрим пример: ) 5.5. Указатели на члены классов // неразумное применение йТТ1: с1авв ОЬ/ес! ( /* ... */ ); // полиморфный с!аев Соп!атег: риЫЫ ОЬ!ес! ( риЫзс: гоЫ ри! (ОЬ!ес!*) з ОЬ!ес!* ае! ( ); // ... сгалл Янр; риЬбс ОЬ!ес! ( /* ... */ ) 1 Янр*/(5Ыр* рв, Сопгатег* с) ( с->риз(рв); // ... ОЬ/ес!* р = с->ае! () ) зу(Янр* а = Мулат!с сав!<БЫр*> (р) ) //проверка на этапе выполнения ( ге!ига о; ) е1ве ( // что-нибудь еи(е (как правило, обработка ошибки) ) ) Здесь класс ОЬ/ес! — необязательный артефакт реализации.

Он слишком общий и не коррелирует с абстракциями какой-либо предметной области; он заставляет прикладного программиста использовать абстракции реализации. Проблемы такого рода часто решаются применением шаблонных контейнеров, хранящих единственный тип указателей: БЫр*/(Япр* рв, 1аг<Янр*>в с) ( с.ривЬ )гоп!(рл); // ... ге!игп с . рор/гоп! ( ) ; ) В комбинации с виртуальными функциями этот подход годится для большинства случаев. 15.5. Указатели на члены классов Многие классы объявляют простые и весьма общие интерфейсы, которые предполагается использовать самыми разными способами.

Например. для большинства «объектно-ориентированных» графических интерфейсов пользователя определяется некоторый набор запросов, реакцию на которые должен обеспечить каждый представленный на экране объект. Кроме того, программы могут формировать такие запросы прямо или косвенно. Рассмотрим простой вариант этой идеи: 506 Глава 15.

Иерархии классов с(ат Я<О Ы(егуасе ( риЫ<с: ч(г<иа! чоЫ я<аг(() = О; ч(г(иа! чоЫ як<реп(< ( ) = О < Ыг(иа! чоЫ геяите () = О; ч(г(иа! чоЫ Оий ( ) = О < Ыг<иа! чоЫзи(! я(ге() = О; итхиа! чоЫ ятей() = О; ч(г(иа! -Б<д (п<е(тасе ( ) ( ) <уре((еу" чоЫ (Бн1 (п(ее<все<: *Рта тет) () < Пуказатель на функцию-член чоЫ <" (Я(О т(ее!все* р) ( РяЫ тет я = аЯМ (п(егГасе::ли<реп<(; << прямой вызов << вызов по указателю на функцию-член р- >ливреи<( ( ) (р->*я) () < Точный смысл каждой операции определяется объектом, для которого она вызвана. Часто, между порождающей запрос программой (от имени пользователя) и получающим запрос объектом находится некоторый промежуточный слой кода.

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

Например, для вызова операции яиязеп<(() пересылается строка "шзреиН". Естественно, что должен быть кто-то, кто формирует такую строку, и кто-то другой, кто ее декодирует, чтобы выявить необходимую операцию (или отсутствие таковой). Часто такой подход может показаться слишком непрямым и слишком утомительным. Вместо этого можно было бы просто пересылать целые числа, представляющие операции. Например, число 2 могло бы означать яияреи<Г( ) .

Однако пусть компьютерам и удобно работать с числами, человеку они мало что говорят. Кроме того, все равно нужно писать код, вьивляющий, что число 2 соответствует операции ят<веи(((), после чего вызывать эту операцию. Теперь рассмотрим такое средство языка С++, как косвенная ссылка на член класса. Значение указателя на член класса идентифицирует этот член класса. Вы можете думать о нем как о позиции члена класса в объекте этого класса, но компилятор, конечно же, учитывает и различия в членах класса: поля данных класса, виртуальные и невиртуальные функции и т.д.

Рассмотрим интерфейс Я((! !п(егуасе. Если я хочу вызвать функцию яияреп<!() для некоторого объекта, не указывая эту операцию напрямую, мне потребуется указатель на о(<! (п(егуасе:: яияреп<(() . Естественно, что мне также будет нужен указатель или ссылка на объект, для которого и нужно вызвать функцию ливреи<((у. Рассмотрим тривиальный пример: 15.5. Указатели на члены классов Указглпель на член класса (ро1лгег ю тетЬег) можно получить с помощью операции взятия адреса, примененную к полностью квалифицированному имени члена класса, например, АЗЫ Ыеггпсе: сдихриа1.

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

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

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

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