Главная » Просмотр файлов » Б. Страуструп - Дизайн и Эволюция C++. 2006

Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 80

Файл №1160775 Б. Страуструп - Дизайн и Эволюция C++. 2006 (Б. Страуструп - Дизайн и Эволюция C++. 2006) 80 страницаБ. Страуструп - Дизайн и Эволюция C++. 2006 (1160775) страница 802019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

14.2.5. Оператор 1уреЫ0 Я надеялся, что оператор купав(с саэс сможет удовлетворить все потребности, так что никаких других механизмов ЙТТ1 пользователям не понадобится. Однако многие пользователи, с которыми я обсуждал этот вопрос, со мной не согласились и указали еще на два момента: а необходимость знать точный тиц объекта, то есть быть уверенным, что объект принадлежит именно классу х, а не классу х нлп производному от него (только последнее и можно получить от оператора дупакьтс саэг); о использование точного типа объекта как источника дополнительной информации об этом типе.

Нахождение точного типа обьекта иногда называют идентификацией типа, поэтому соответствующий оператор я назвал суреЫ. Точный тип объекта нужно знать для того, чтобы применить ко всему объекту некоторый стандартный сервис. В идеале такие сервисы должны предоставляться в виде виртуальных функций, так что точный тнп знать не обязательно, но, когда этой функции нет, знание точного типа и выполнение над ним операции необходимы. Системы объектного ввода/вывода и системы баз данных работают именно так. В подобных случаях нельзя предполагать наличие общего интерфейса у всех управляемых объектов, поэтому приходится прибегать к ~очному типу. Другое, гораздо более простое применение — получить имя класса для выдачи диагностического сообщения: соэс «суре с1*р) .пашен Идентификация типа во время исполнения ИффффЯЯЩ Встроенный оператор суре1с) ( ) используется для получения доступа к информации о типах во время выполнения.

Если бы он являлся функцией, ее объявление могло выглядеть так; т4.2.5.1. )Слдсс 1уре !пФо Класс суре 1пйо определен в заголовочном файле <суре 1пбо.)т>, который нужно включать, если используется результат, выданный суре Ы ( ) . Точное определение класса суре 1пЕо зависит от реализации, но это полиморфный тип, в котором имеются операторы сравнения и операция, возвращающая имя типа: с1авв суре 1пго ( // представление зависит от реализации рг(часе: суре (пго(сопвг гуре 1пгоа); // пользователи ые могут гуре 1пгоа орегагог=(попас суре 1пгоь))// копировать суре 1п1о риЬ11с: уфггиа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 это значит, что сравнение результатов Гуре 1г) ( ) нельзя определить просто как сравнение указателей на объекты типа суре 1пбо.

Если же суре Ы ( ) возвращает ссылку на суре 1пйо, то нетрудно определить оператор ==, так чтобы он правильно обрабатывал возможное дублирование объектов суре 1пбо для одного и того же типа. ПИИИИИИВ Приведение типов Может предоставляться и более детальная информация. Однако пользователи понимают <детальную информацию> по-разному. Тем же, кому она вообще не нужна, хотелось бы уменьшить расход памяти. Поэтому предоставляемые типом гуре 1п1о сведения намеренно сведены к минимуму. Функция Ье йоге ( ) предназначена для сортировки объектов типа гуре 1пйо, чтобы их можно было хранить в хэш-таблицах и т.п. Отношение, описываемое этой функцией, никак не связано с отношением наследования (см.

раздел [4.2.8.3). Более того, нет никакой гарантии, что Ьейоге ( ) будет давать одинаковые результаты в разных программах или при разных запусках одной и той же программы. В этом смысле Ьейоге() напоминает оператор взятия адреса. ()1пс1пг)е <гуре 1п1о.'и> ехгегп мар<му гуре упало,сопзг сваг*> ву гуре гаые; уоье г(В* р) ( му гуре 1пгоа в1 = ву гуре гаЫе[гуре>д("р).паве()); // воспользоваться в1 ) Кто-то предпочел бы индексировать таблицы непосредственно значениями гуре1<1 ( ), а не требовать от пользователя обращения к строке паве ( ): ехгегп нар<упит гуре 1п1о,гуре 1пго*> уоиг гуре гаЫе; уо1<) д(в* р) [ уоиг гуре 1пгоа у1 = уоиг гуре гаЫе[агуре1г)(*р)] // воспользоваться у1 ) С помощью такого способа ассоциирования результатов гурейг) с информацией пользователи могут привязывать к типам различную информацию (см. рис. 14.1).

/гналогичные действия производятся и инструментальными средствами. При этом добавленные сведения не мешают друг другу. Это очень важно, поскольку вероятность, что есть информация, устраивающая всех пользователей, равна нулю. Любой набор данных о типе, устраивающий 14.2.5.2. Расширенна» информация о типе Иногда знание точного типа объекта — это лишь первый шаг к получению более летальной информации об этом тине.

Рассмотрим, как компилятор или инструментальное средство могли бы предоставить пользователю информацию о типах во время исполнения. Предположим, что имеется инструмент, генерирующин таблицу обьектов типа Му гуре 1пйо. Наилучший способ представления информации пользователю — применение ассоциативного массива (отображение, словарь), который сопоставляет такие таблицы с именами типов. Чтобы получить таблицу для конкретного типа, можно было бы наппсатгя Идентификация типа во время исполнения ~ИфффффЩ даже большинство пользователей, повлек бы за собой огромные издержки для тех, кому нужны лишь минимальные сведения.

иу суре санга о Моя дополнительная информация о типе уаяс суре саьте асуразе(т) Рис. 14.1 Разработчик компилятора может по своему выбору предоставлять информацию о типе, специфичную для данной реализации. Доступ к такой расширенной системной информации можно получать с помощью ассоциативного массива точно так же, как и к дополнительной информации, предоставляемой пользователем. Вместо этого допустимо поместить расширенную информацию в класс ехсепс)ес) суре тисо, производный от суре того (см. рис. 14.2). сура тпго: Рис. 14.2 Чтобы понять, имеется ли нужная расширенная информация о типе, можно было бы воспользоваться оператором йупагасс сазс: Етпстцс)е <суре тпсо.)т> сурес)ес ехсепс)ег) суре тяго ест; той Г(яопесуре* р) БИИИИИИВ Приведение типов (ась* р = г)упааьс саве<ась*>(асуреЫ(*р) ) ) ( // ) ) Какую расширенную информацию мог бы получить пользователь с помощью компилятора илн инструментального средства? Практически любую имеющуюся в компиляторе, если во время выполнения она понадобится некоторой программе.

Например: с) сведения о размещении объекта лля ввода/вывода объектов или отладки; з указатели па функции создания и копирования объектов; з таблицы функций вместе с символическими именами лля вызова из интерпретатора; (з списки объектов данного типа; гз ссылки на исхолный кол функций-членов; ы встроенную документацию по классу. 14.2.б. Модель размещения объекта в памяти Вот как мог бы размещаться в памяти объект с таблицей виртуальных функций и информацией о типе (см.

рис. 14.3). ау т чсщ Рис. 14.3 Пунктирная стрелка с длинными штрихами представляет смещение, по которому можно найти начало полного объекта, имея лишь указатель на полиморфный подобъект. Это абсолютный аналог смещения (дельты), используемого при реализации виртуальных функций (см, раздел 12.4). Для каждого типа с виртуальными функциями генерируется объект типа суре 1пйо. Эти обьекты не обязательно должны быть уникальными.

Однако хороший компилятор будет везде, гле возможно, генерировать уникальные объекты Все это вынесено в библиотеки, возможно лаже станлартные, поскольку есть очень много разных потребностей, зависящих от реализации леталей и слишком много информации, чтобы поддерживать ее в самом языке. С лругой стороны, некоторые возможные применения позволяют обойти статический контроль типов, а другие требуют неоправданно болыцих затрат. Идентификация типа во время исполнения ЦЯЯЯЯЯЯЩ суре фпбо и лишь для тех типов, для которых действительно используется в каком-то виде информация о типе. В простой реализации объект суре фпбо для класса разрешается поместить прямо рядом с усЬ1.

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

74.2.7. Простой ввод/вывод объектов Ниже представлены идея, как можно было бы испольэовать КТТ1 в простой системе ввода/вывода объектов, и возможная схема реализации такой сне~сны. Пользователь хочет прочитать объекты из потока, убелиться, что они имеют ожидаемые типы, а затем как-то их применить. Например: чоЫ ияех() ( // открыть файл, предполагая, что он содержит объекты типа // янаре, и присоединить к этому файлу яя в качестве 1ясхеаш // Яо оЬ1* р = дев оЬЯ(яя); // читать объект иэ патока Яб (Яваре* вр = дупашьс саяс<ЯЬаре*>(р)) ( яр->бган()) // испольэоэать Япаре // ) е1яе ( // ошибка: в файле есть объект, // не принадлежащий классу Япаре Функция пяех ( ) работает с фигурами только через абстрактный класс ЯЬаре и потому готова принять любую фигуру.

Использование с)упав)фс саяе необходимо, поскольку система объектного ввода/вывода способна работать и со многими другими видами объектов, так что пользователь может случайно открыть файл, содержащий объекты, но только из классов, о которых он ранее не слышал. Такая система объектного ввода/вывода предполагает, что каждый объект, который можно записывать или считывать, принадлежит классу, производному отфо сЬ~. Класс фо оЬя должен быль полиморфным,чтобы кнемуможнобыло применять оператор с)упал)1с саяс. Например: ЙИИИИИИ11 Приведение типов с1авя 1о оЬ] ( // полимор4ный у1гхиа1 1о оЬ]* с1опе(); ); хуреое1 1о оЬ)* (*РР)(1яхгеаша); Мар<вхгтпд,РР> то шар; // отображение строк на функции создания то оЬ1" дев оЬ)(тяхгеаша я) ( яхт)пд ясг; (дев иохс)(я,ягг) == О) ХЬхои по с1аяяу // прочитать в яхт начальное слово РР 1 = 1о шар(ьхг); // найти Функцию по "всг" Рх (1 == О) ЬЬхои ипкпоип с1авя; // функции не нашлось 1о оЬ]* р = 1(я); // сконструировать объект из потока 11 (с)еЬод) соус « хуреьд(*р).паше() « '1п'; Отображение 1о а|ар класса )чар — это ассоциативный массив, который содержит пары, состоящие из строки имени и функции, способной сконструировать обьект класса с этим именем.

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

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

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

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