А. Александреску - Современное проектирование на C++ (1119444), страница 51
Текст из файла (страница 51)
° стратегия 5тогаде Граздея 73). по умолчанию сохраняемым типом является тип т* (тип т — это первый шаблонный параметр класса 5вагтгтг), типом указателей — тоже т", а ссылочным типом — тй. Объект, на который ссылается интеллектуальный указатель, уничтожается оператором де1ете. ° Стратегия Оппегзп1р Граздея 75). Обычно реализуется с помощью глубокого копирования, подсчета ссылок, связывания ссылок и разрушающего копирования. Обратите внимание на то, что стратегия Оппегз)з1р не связана с механизмом уничтожения объектов„который относится к стратегии 5тогаае.
Стратегия оппегзп1р лишь указывает момент уничтожения объекта. ° Стратегия сопуегээоп Граздея 7,7). В некоторых приложениях необходимо преобразовывать интеллектуальные указатели в обычные. Обратное преобразование не допускается. ° Стратегия спеск1по (раздел-7.10). Эта стратегия проверяет правильность инициализации и разыменования класса 5яагтятг.
Остальные свойства не настолько важны, чтобы создавать для них отдельные стратегии. ° Оператор взятия адреса (раздел 7.6) лучше не перегружать. 209 Глава 7. Интеллектуальные указатели ° Проверка равенства и неравенства выполняется с помощью приема, описанного в разделе 7Л). ° Отношения порядка (раздел 7.9) остаются нереализованными.
Однако в библиотеке Еой осуществляется специализация функции зтд::1езз для объектов кЛасса 5вагтРтг. Пользователь может определить оператор <, а библиотека Еой поможет выразить через него остальные операторы сравнения. ° В библиотеке Еой) определена корректная реализация константных объектов класса 5вагтРтг, объектов, на которые ссылаются интеллектуальные указатели, а также их обоих одновременно.
° Массивы специально не предусматриваются, однако одна из готовых реализаций стратегии 5тогаде может удалять массивы с помощью оператора де1ете Ц. Каждый аспект реализации класса 5яагтРтг рассматривался отдельно от осталь- ных. Это позволяет лучше разобраться в их механизмах. Намного полезнее разобрать реализацию на части и рассмотреть их по отдельности, чем изучать их в комплексе.
Разделяй и властвуй — этот старый девиз Юлия Пезаря вполне пригоден для раз- работки интеллектуальных указателей. (Бьюсь об заклад, он этого не предвидел!) Мы разбиваем проблемы на небольшие составные классы, называемые сл|ратегиями (ро!(су).
Каждая стратегия связана только с одним аспектом реализации класса. Класс 5вагтртг наследует все эти классы, одновременно приобретая все их свойства. Это очень простой и невероятно гибкий механизм. Кроме того, каждая стратегия задается одним шаблонным параметром. Это позволят смешивать и сопоставлять существую- щие классы стратегий, а также создавать на их основе свои собственные стратегии. Первым илет тип объекта, на который ссылается интеллектуальный указатель, за ним — все стратегии. В итоге получается следующее объявление класса 5яаггвтг.
тевр1ате < турепаве т, теяр1ате <с1аьа> с1азз сзхпегзЫрРо1зсу кеФсоцптеб, с1азз СопчегззопРо1(су п(за11оиСопчегззоп, тевр1ате <с1аьв> с1авэ СпесК!пдРо1!су = лззегтс!зесй, тевр1ате <с1авв> с1авв 5тогадеРо1зсу = оеФац1т5Р5тогаде > с1азз 5вагтРтг; Сначала следует указывать стратегии, которые настраиваются чаше других. Ниже рассматриваются требования, предъявляемые к четырем стратегиям, определенным ранее. Все эти стратегии должны иметь семантику значений, т.е.
они должны определять соответствующие конструктор копирования и оператор присваивания. 7. 74. 7. Многопоточность нв уровне объектов Стратегия 5тогаде абстрагирует структуру интеллектуального указателя. Она осуществляет определение типов и хранит фактический объект роз птее . Если класс 5тогадетвр1 является реализацией стратегии 5тогаде, а зтогадетвр1— это обьект типа 5тогадетвр1<т>, то применяются конструкции, указанные в табл. 7, !. Реализация стратегии 5тогаде по умолчанию имеет следующий вил.
тевр1ате <с1ава т> с1азз пебаи1т5Р5тогаде ( ргогестед: 210 Часть !!. Компоненты Таблица 7.1. Конструкции стратегии Всогада Выражение Семантика 5СОГадесвр1<т>::5согеотуре 5Согадетвр1«т>::Ро1псегтуре Тип, фактнчсски хранимыи рсалнзацисй. По умолчанию; т* Тнп указателей, опрсдслснный реализацией. Возврашастся оператором ->, опрсдслснным в классе 5вагсрсг. По умолчанию: т*.
Может отличаться от типа 5Согадетвр1<т>:: 5согеотуре, если используется исрархия интеллектуальных указателей (раздслы 7.3 и 7.13.1) Ссылочный тип. Возврашастся оператором + класса 5вагСРСг. По умолчанию; Тб Возвращает объскт типа 5Согадесвр1<т>::5согедтуре Возврашаст объект типа 5согадесвр1<т>:: 5согеотуреб (сслн объект зсогадесвр1 является константным, конструкция объявлястся константной) 5согадесвр1<т>::яеФегепсетуре Оетсвр1(зсогадесвр1) ОЕССВр1яЕт(ЗСОГадЕСВр1) 211 Глава 7.
Интеллектуальные указатели суреоег' т* 5согебтуре; // тип объекта розпсее суреое5 т* Розптегтуре; // тип объекта, // возвращаемого оператором -> суреоеУ тб яеУегепсетуре; // тип объекта, // возвращаемого оператором ' рцб)1с: оетац)с5Р5согадеО : розпсее (оетац1сО) () оетац1с5Р5согаде(сопят 5согеотуреб р): ро1псее (р) () Розпсегтуре орегасог->О сопзс ( гесцгп ро1псее ; ) яетегепсетуре орегасог*О сопас ( гетцгп "ро1псее ; ) 1г1епо' (п1(пе Ро(псегтуре Оеттвр1(сопят оетац1с5Р5согадеб зр) ( гесцгп зр.ро(псее ; ) тг1епо' 1п11пе сонат 5согеотуреб аессвр1яет( сопев оеУац1с5р5согадеб зр) ( гесцгп зр.ро(псее тг1епо' (п1(пе 5Согеотуреб аессвр1яет(оеУац1с5Р5Согадеб зр) ( гесцгп зр.ро(псее ; ) ргосессед: чо1о оезсгоуО ( де1есе ро1псее ; ) зсас1с бсогедтуре оетац1сО ( гесцгп О; рг1часе".
5согедтуре ро1псее ; Кроме класса оетац1с5Р5согаде в библиотеке (.о)ц определены слсдуюшис классы. ° класс аггау5согаде, используюший оператор ое1есеЦ внутри функции яе1еазе. ° Класс кос)сеЖсогаде, используюший иерархическую реализацию интеллектуального класса, захватываюшсго ланныс при разымсновании (раздсл 7.13.!). ° Класс неар5Согаде, используюший явный вызов деструктора и функцию зсд:: бгее для освобождения данных.
Окончание табл. 7.! Семаатнка Выражение зтогайетвр1.орегатог->0 Возвращает объект типа 5Согайе1вр1<т>::: Рсз птегтуре. Используется оператором -> класса 5вагСРСг з Со гайетвр1. о регат о г*0 Возвращает объект типа 5Согайе1вр1<т>::йебегепсетуре. Используется оператором * класса 5вагСРСг Возвращает значение, заданное по умолчанию (обычно нуль) 5Согаде1вр1<т>::5Согебтуре р; р = зсогайе1вр1.оеГаи1с0; зтогайетвр1.Оезтгоу0 Разрушает объект, на который ссьшается интеллектуальный указатель Таблица 7.2. Конструкции стратегии ОччпегаКйр Выражение Семантика Р ча11; Клонирует объект.
Может молифицировать Р ча12 Онпегз)мр1вр1.С1опе(ча1Ц; исхолиое значение, если в стратегии ОппегзЫр применяется разрушающее копирование Клоиирует объект сопзс Р ча11; Р ча12 = онпегзйзртвр1. С1опе(ча11); Р ча1; Ьоо1 цп)йие = оипегзйтртвр1. ае1еазе(ча1); Освобождает объект. Возвращает значение сгце, если была освобождена последняя ссылка на объект Ьоо1 дс = Онпегзйзртвр1<Р>:: г)езсгцссзчеСору; устанавливает, должна ли стратегия Оппегзйз р применять разрушающее копирование. Если ла, класс 5вагСРСг применяет примем Колвина — Гиббонса (Меуса, )999), использованный в классе зсб::ацсо рсг Часть й.
Компоненты 7. 14.2. Стратегия ОиглегвЫр Стратегия Онпегз)Ир должна поддерживать как внедренный, так и независимый подсчет ссылок. Следовательно, она должна использовать явные вызовы функции, а не механизм конструкторов и деструкторов, как это сделано в работе (Коеп)й, 1996). 22ело в том, что функцию-член можно вызвать в любое время, а конструкторы и деструкторы вызываются автоматически и только в определенные моменты времени. Реализация стратегии онпегз1п'р имеет один шаблонный параметр, соответствующий ссылочному типу.
Класс 5вагсрсг передает параметр 5согайеРо1зсу<т>::Ротпсеггуре классу онпегз)И рро11су. Обратите внимание на то, что шаблонный параметр класса онпегзЫ рро1тсу является типом указателя, а не объекта, на который он ссылается. Если класс оппегзйзртвр1 является реализацией стратегии онпегзйзр, а онпегзйтртвр1 — это объект типа Оипегзйзртвр1<Р>, то применяются конструкции, указанные в табл.