ПредишенСледващото

шаблон

инлайн Тип * MP:: оператор -> () конст

Така че, след кратко отопление умни указатели са станали водещи. Сега в нашата варя, има и друг компонент - дескриптори (дръжки) C ++. Не бъркайте този термин с дескриптори, използвани в операционната система Macintosh и Windows. Има известно сходство, но ЕВРОВОК C ++ идиом има свой уникален набор от правила и семантика.

Основната идея е да се използва умни указатели да се позова на водещите индикатори. Тези допълнителни показатели и са наречени описания. Основата, на която ще се изгражда клас от описание: в първо приближение е както следва:

шаблон

MP оператор -> () конст

N аргумент конструктор създава нов господар индекс. Този водещ индикатор, от своя страна, прави конфигурируеми обект. Има втора конструктор, който заема лидерски показалеца и ги инициализира променлива КОП. На строителя на копие и костюм оператор = по подразбиране, като всеки майстор индекс може да съответства на няколко описания. Работа оператор -> се основава на рекурсивни алгоритми, които се използват от компилатора: -> оператор връща ЕВРОВОК показалка водещия на; след това -> домакин показалка връща тип показалка * който е един от основните типове компилаторът.

Горното решение не може да се нарече изящна - вложени шаблони да създаде объркване, освен това не е ясно кога и как да се премахне водещите индикатори. Освен това, дали да се позволи на потребителя директно да се създаде и унищожи водещите индикатори, или да ги затворете в рамките на дръжките, както сме заключи, уточни предмета във водещи показатели? Имат ли сме работили за решаване на тези проблеми, за да определите обекта, само за да се сблъскате с тях отново за водещите индикатори? Търпението - своевременно ще намерите отговор на тези и много други въпроси.

Какво имаме?

Ще започнем с един прост пример на водещите индикатори и ние ще го подобри до ниво, което би отговаряло по-взискателни аудитория. На този етап все още е трудно да се разбере от всички предимства на описания, но в следващите глави, те ще играят много важна роля.

броене на обекти

Да речем, че искате да следите броя на създадени или в памет на един клас от обекти. Едно от решенията - да се съхранява тази информация в статичните променливи на класа.

клас CountedStuff

статично вътр ток; публичния:

CountedStuff () CountedStuff (конст CuntedStuff) CountedStuff оператор = (конст CountedStuff)

<> // Не променяйте тезгяха за възлагане

С този пример все още можете да човъркат и да го подобри, но без значение колко се опитате, е необходимо да се промени кода мишена клас - най-малко, за да стане тя наследи от нашия клас. Сега предполагам, че показва, обектът влезе в търговска библиотека. Това е срам, нали? Всички промени са нежелателни, а по-скоро, просто невъзможно. Но тук идва в игра водещият индикатор клас.

шаблон клас СМР

статично вътр ток; Тип * PTR;

CMP (Конст СМР СМР). PTR (нов тип (* (mp.t))) CMP оператор = (конст CMP СМР)

ако (това! = СМР)

КОП = нов тип (* (cmp.ptr));

Сега водещият индекс прави всички изчисления за вас. То не изисква промени в класа на определения обект. Този шаблон може да се използва за всеки един клас, при условие, че вие ​​ще бъдете в състояние да изтръгне няколко насоки между клиента и уточняване на обекта. Дори ако нямате нищо против промяна на оригиналния клас на определен обект, се гарантира степен на модулност без водещите индикатори ще бъде изключително трудно (например, ако се опита да работи през базовия клас, резултатът щеше да има статична променлива ток на всички получени класове).

Този пример е тривиално, но дори и той показва един важен принцип на програмиране в C ++, валидността на който в крайна сметка става ясно: да се използват умни указатели, дори и ако в началото изглежда, че те не са необходими. Ако една програма, написана за умни указатели, всички промени, които са направени бързо и лесно. Ако трябва да ремонтирам съществуващата програма и да замени всички оператори * умни указатели, да бъдат готови за една нощ бдение.

Глава 14 вариации по темата на отчитане ще бъдат използвани за изпълнение на един прост, но в същото време мощен схема за управление на паметта - събиране на отпадъци във връзка с отчитане.

Указатели за само за четене

Да предположим, че искате да се уверите, че даден обект никога не се актуализира (или най-малкото не е актуализиран редовни клиенти). Този проблем се решава лесно с помощта на водещите индикатори

- достатъчно, за да оператор функция оператор -> () функции на константи членки.

шаблон

ROMP оператор = (конст ROMP); Вид строителство * оператор -> () Конст;

Показва обекта е заключен здраво, така че да не се стигне до изравняване на ЦРУ. По принцип, същото може да се направи с един прост умен показалеца, но водещите индикатори осигуряват абсолютна защита, тъй като клиентът никога не получава пряк достъп до местата на обекта.

Указатели за четене / запис

В много ситуации, не е оптимално представяне на обекта, което е наистина само за операции за четене. Ако клиентът иска да промени даден обект, идея е да се промени.

Би било лесно да се направи, ако имате две претоварени версии на оператор ->. една от които връща Foo *. а другият - CONST Foo *. За съжаление, различни видове връщане не предоставят уникални подписи, така че, когато се опитате да обяви два оператора -> компилатор ще се смее от сърце. Програмистът трябва да извикате функция предварително, което прави преход от едно изображение в друго.

Едно от възможните прилагане на тази схема - разпределени обекти. Ако обектът не е копие на актуализирани местни клиенти, те могат да бъдат разпръснати из цялата мрежа. Това е съвсем друго - да координира актуализации няколко копия. Можете да зададете правило, което позволява съществуването на неограничен брой копия, за да бъде само за четене, но само един майстор копие. За да актуализирате даден обект, трябва първо да получите главното копие на текущата й собственик. Разбира се, ние трябва да се вземат под внимание много нюанси (по-специално, процедурата за промяна на собственика на основното копие), но на правилното прилагане на водещите индикатори позволява да се реализира тази концепция е учудващо проста и прозрачна за клиента.

Подкрепете проекта - споделете линка, благодаря!