Преобразовать boost :: shared_ptr в реальный класс - PullRequest
2 голосов
/ 10 ноября 2010

Как бы кто-нибудь это сделал? например:

Client* client = it->second;

где it-> second - это повышение :: shared_ptr для клиента Ошибка:

cannot convert `const ClientPtr' to `Client*' in initialization

Ответы [ 4 ]

7 голосов
/ 10 ноября 2010

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

7 голосов
/ 10 ноября 2010

boost :: shared_ptr имеет метод .get () для получения необработанного указателя.

Документация о том, когда и почему его не следует использовать: http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/shared_ptr.htm

2 голосов
/ 10 ноября 2010

boost:shared_ptr перегрузки operator*:

boost::shared_ptr< T > t_ptr(new T());
*t_ptr; // this expression is a T object

Чтобы получить указатель на t, вы можете использовать функцию get или взять адрес *t_ptr:

&*t_ptr; // this expression is a T*

Первый метод (с использованием get), вероятно, лучше и имеет меньше накладных расходов, но работает только с shared_ptr s (или указателями с совместимым API), а не с указателями другого типа.

1 голос
/ 10 ноября 2010

Не опасно, но задействован c-ctor.

Client client( *(it->second.get()) );
...