Возвращение C ++ полиморфных объектов (интерфейсов) - PullRequest
5 голосов
/ 20 января 2011

Я хотел бы знать, что в настоящее время считается наилучшей практикой при возврате указателя на полиморфный объект из функции, например, при использовании фабрик. Если я передам право собственности, должен ли я вернуть boost::unique_ptr<Interface>? Что я должен вернуть, если я не передал право собственности (например, вернул ссылку на участника)? Есть ли альтернативный, не основанный на повышении способ, который также обычно используется? Спасибо.

РЕДАКТИРОВАТЬ: предполагается, что он совместим с C ++ 03, с возможностью простого обновления до 0x

РЕДАКТИРОВАТЬ 2: Обратите внимание, что я явно спрашиваю о общих подходах, лучших практиках, а не просто "способ сделать это". Решение, предполагающее условный поиск и замену по базе кода в будущем, не выглядит хорошей практикой, не так ли?

EDIT3: Еще один момент, связанный с auto_ptr, заключается в том, что он устарел , каким бы аккуратным он ни был, поэтому выглядит странным объявление о его использовании на уровне интерфейса. Затем кто-то, кто не знает, поместит возвращенный указатель в контейнер STL и так далее, и так далее. Так что, если вы знаете другое, довольно распространенное решение, вы можете добавить ответ.

1 Ответ

5 голосов
/ 20 января 2011

Используйте ::std::auto_ptr на данный момент, и когда C ++ 0x доступен, затем переключитесь на ::std::unique_ptr.По крайней мере, в заводском случае, когда вы передаете право собственности вызывающей стороне.

Да ::std::auto_ptr имеет проблемы и выглядит ужасно.Да, это не рекомендуется в C ++ 0x.Но это рекомендуемый способ сделать это.Я не исследовал ::boost::unique_ptr, но без семантики перемещения я не вижу, что он может работать лучше, чем ::std::auto_ptr.

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

::std::auto_ptr<int> p(new int);
::std::auto_ptr<int> p2 = p; 

должен будет, по крайней мере, стать таким

::std::unique_ptr<int> p(new int);
::std::unique_ptr<int> p2 = ::std::move(p);

Я предпочитаю поиск и замену, потому что я считаю, что с помощью макросов и typedefs для таких вещей, какэто, как правило, делает вещи более туманными и трудными для понимания позже.Поиск и замена вашей кодовой базы могут применяться выборочно, если это необходимо (::std::auto_ptr не исчезнет в C ++ 0x, это просто устарело) и оставляет ваш код с ясным и очевидным намерением.

Какдля того, что «обычно» сделано, я не думаю, что проблема существовала достаточно долго, чтобы существовал общепринятый метод обработки перехода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...