Как заставить объект указывать общий указатель?

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

дополнительная документация дает отличный обзор.

ИЗМЕНИТЬ

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