Как получить Объект, на который указывает общий указатель? - PullRequest
30 голосов
/ 27 июня 2011

У меня есть запрос. Можем ли мы получить объект, на который указывает общий указатель напрямую? Или мы должны получить базовый указатель RAW через вызов get() и затем получить доступ к соответствующему объекту?

Ответы [ 2 ]

51 голосов
/ 28 июня 2011

У вас есть две возможности получить ссылку на объект, на который указывает shared_ptr. Предположим, у вас есть переменная shared_ptr с именем ptr. Вы можете получить ссылку, используя *ptr или *ptr.get(). Эти два должны быть эквивалентны, но первый будет предпочтительным.

Причина этого в том, что вы действительно пытаетесь имитировать операцию разыменования необработанного указателя. Выражение *ptr гласит «Получить мне данные, на которые указывает ptr», тогда как выражение *ptr.get() «Получить мне данные, на которые указывает необработанный указатель, заключенный в ptr». Ясно, что первый описывает ваше намерение гораздо более четко.

Другая причина заключается в том, что shared_ptr::get() предназначен для использования в сценарии, где на самом деле необходим доступ к необработанному указателю. В вашем случае это вам не нужно, поэтому не просите об этом. Просто пропустите весь необработанный указатель и продолжайте жить в своем более безопасном мире shared_ptr.

15 голосов
/ 28 июня 2011

Ответ Кена выше (или ниже, в зависимости от того, как они отсортированы) великолепен.У меня недостаточно репутации, чтобы комментировать, в противном случае я бы.

Я просто хотел бы добавить, что вы также можете использовать оператор -> непосредственно на shared_ptr для доступа к членам объекта, который онуказывает на.

В расширенной документации представлен отличный обзор.

РЕДАКТИРОВАТЬ

Теперь, когда C ++ 11 получил широкое распространение, std::shared_ptr следует отдавать предпочтение версии Boost.Смотрите операторы разыменования здесь .

...