возвращение указателя с фабрики

Каков наилучший способ вернуть указатель с фабрики? Должно ли это быть std::unique_ptr или же std::shared_ptr или просто необработанный указатель?

Также мне сказали, что нужно идти за std::unique_ptr если есть сдерживание и std::shared_ptr если есть агрегация. Это правильный путь?

4

Решение

Вы должны рассматривать необработанные указатели только в очень особых случаях, таких как передача указателя через границу DLL.

Между shared_ptr а также unique_ptrМоё мнение — предпочесть последнее. Это делает интерфейс более гибким для ваших пользователей. Они всегда могут конвертировать возвращенные unique_ptr к shared_ptr если они хотят, но что более важно, они также могут позвонить unique_ptr::release а затем вручную управлять указателем (возможно, это не очень хорошая идея, но она оставляет опцию открытой).

Если вашей фабрике нужно назначить пользовательский удалитель для возвращенного unique_ptr, разница в поведении между unique_ptr а также shared_ptr Вы должны знать, что первый не будет вызывать средство удаления, если управляемый указатель nullptr, но последняя будет. Итак, если ваш завод может вернуться nullptr (возможно, как условие отказа), и кто-то преобразует unique_ptr к shared_ptr, затем убедитесь, что удалитель может обработать вызов с nullptr в качестве аргумента.

5

Другие решения

Вы, конечно, не должны возвращать необработанный указатель. Я думаю, что std :: unique_ptr и std :: shared_ptr одинаково хороши в большинстве случаев. Но, конечно, стандартные классы умных указателей не единственные. Например, есть классы, которые реализуют навязчивый подсчет ссылок, и люди реализуют специальный класс интеллектуальных указателей для их обработки, обычно называемый RefPtr. Есть также COM-интерфейсы, для которых есть CComPtr.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector