2010-08-02 3 views
5

Я только что закончил Koenig & Ускоренный C++ Moo и в главах 13 & 14 они излагают идею и реализацию нескольких классов Handle (простых, общих, подсчитанных ссылок).Является ли ручка тем же самым, что и умный указатель?

Классы encpasulate необработанный указатель и абстрагируют выделение/освобождение динамических объектов от кода клиента, чтобы избежать всех опасностей необработанных указателей, а также позволяя пользователю разыгрывать их для доступа к указанному объекту. По сути, это «безопасный» способ взаимодействия с необработанными ресурсами памяти.

Являются ли классы, представленные в этих главах, по существу реализацией интеллектуальных указателей? Умные указатели по-прежнему новы для меня, но из того, что я понимаю, эти классы Handle выполняют одну и ту же функцию.

  1. Есть ли разница между двумя или это просто другое имя для одной и той же вещи?
  2. Предполагая, что они эквивалентны в функции, на практике такой класс когда-либо будет написан с нуля, а не с использованием уже сделанного интеллектуального указателя?

EDIT

Я хотел бы добавить, что классы они развиваются в этих главах шаблонные классы таким образом, они не привязаны к конкретному ресурсу, как они не разработке конкретного класса FILEHANDLE, например.

Код в первом фрагменте кода here, 7.1, в значительной степени соответствует тем, что у них есть в главах, о которых я говорю.

ответ

6

Из вашего описания это звучит как умный указатель.
Хотя лично я бы не использовал термин дескриптор, поскольку он слегка неоднозначен (просто назовите умный указатель умным указателем).

В: Не могли бы вы написать умный указатель с нуля?
A: Да

В: Должны ли вы писать свой собственный умный указатель.
A: Нет. Это намного сложнее, чем вы думаете. Даже описание в книге только затушевывало более сложные проблемы. Придерживайтесь стандартных, которые предоставляются авторитетными библиотеками.

В: Обрабатывает то, что это значит.
A: Он имел обыкновение означать указатель на указатель. Но этот термин стал неоднозначным на протяжении многих лет, поскольку этот термин был повторно использован. Но вы можете считать его указателем на ресурс, к которому ресурс может получить доступ другими методами, и в этом контексте их описание является допустимым.

В: Следует использовать интеллектуальные указатели вместо необработанной памяти.
A: Никогда не используйте RAW-память, если это абсолютно необходимо (что практически никогда) всегда инкапсулирует ее в класс, который ее управляет. Является ли класс умным указателем или другим типом объекта, является хорошим вопросом. std :: vector не считается интеллектуальным указателем, но он инкапсулирует указатель RAW.

В: Должны ли вы абстрактно управлять памятью из бизнес-логики:
A: Это сложно, а некоторые могут не согласиться. Но я бы сказал всегда. Класс должен сделать одно. Это либо управление ресурсами, либо бизнес-логикой. объединяя два вывода слишком непредвиденных сложностей.

+0

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

1

Я бы сказал, что ручка является более общей концепцией, чем умный указатель.

Рассмотрите, например, ручки файлов. Дескриптор файла может быть интеллектуальным указателем на структуру данных, представляющую открытый файл, но клиент на самом деле не считает это указателем, а просто передает дескриптор API.

Итак, да, я несколько раз писал свои собственные классы ручек.

+0

Я думаю, что точка, которую вы пытаетесь понять, заключается в том, что дескриптор * непрозрачный * указатель (и может быть или не быть умным, как правило, на самом деле не является). –

+0

@ Бэн, да, это хороший способ сказать это. Не стесняйтесь редактировать, если вы считаете, что это необходимо. – djna

2

Если вы простите немного метафорического C++, это будет примерно так: class smart_pointer : public handle;. Смарт-указатель - это дескриптор, который обеспечивает конкретный (похожий на указатель) стиль интерфейса между дескриптором и тем, что он обрабатывает. Ручка, которая не является умным указателем, обычно имеет (по крайней мере смутно) аналогичные операции, но их интерфейс может быть совершенно другим.

В какой-то момент кто-то, очевидно, должен написать класс интеллектуальных указателей. В то же время это не то, что нужно предпринять легкомысленно. Если у вас нет точной спецификации , вы, вероятно, получите хотя бы несколько деталей неправильно и что «предельно точная спецификация» уменьшает вероятность до 50:50 ...

OTOH, это все еще не так плохо, как проектирование умного указателя. Это, как правило, сложно. Для очевидного примера auto_ptr был спроектирован и повторно спроектирован несколько раз во время стандартизации, но он по-прежнему довольно мало используется в реальной жизни и уже устарел в C++ 0x (заменен на std::unique_ptr, который является продуктом a лот работы, дебатов и небольшого количества экспериментов и испытаний).

+0

Я всегда нахожусь для метафорического C++ :) – MTLPhil