У меня есть запрос. Можно ли получить объект, на который указывает общий указатель? Или мы должны получить основной указатель 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. См. Операторы разыменования здесь.