2015-05-13 3 views
2

Я использую box2d, и, как вы уже знаете, он содержит void * для объекта, который я могу использовать в качестве ссылки при возникновении столкновений между различными объектами. Проблема в том, что исходный элемент сохраняется внутри shared_ptr, так как собственность неизвестна, а разные классы (например, класс игрока) могут «экипировать» другой класс (оружие).C++ - необработанный указатель на shared_ptr

Мне просто интересно, можно ли поместить этот указатель внутри shared_ptr и обратиться к тому же объекту, что и оригинал?

Это пример:

std::vector<std::shared_ptr<Environment>> listEnvironment; 
listEnvironment.push_back(std::make_shared(new Weapon())); 

//takes a void pointer 
box2d->userId = listEnvironment.back().get(); 

//some shit happens somewhere else and collision occurs and I get pointer back from box2d's callback: 

Environment* envPtr = static_cast<Environment*>(box2d->userId); 

Как вы можете видеть envPtr собирается вызвать проблемы. Есть ли способ ссылаться на старый смарт-указатель и увеличить его ссылочное значение?

PS:

В действительности каждый класс создает Box2D тело, которое держит «это» указатель, так что я на самом деле не имеют адреса в смарт-указатель либо. Приведенный выше пример подобрался, чтобы дать вам намек на проблему, с которой я сталкиваюсь.

С наилучшими пожеланиями Нило

+0

Почему 'envPtr' может вызвать проблемы? Что-то попытается удалить? Или он будет жить дольше, чем умный указатель, который управляет своей жизнью? – Galik

+0

Но указатель останется действительным до тех пор, пока вы его не удалите, и до тех пор, пока существует значение 'shared_ptr', удерживающее его значение. Если кто-то украдет ваше оружие, вы собираетесь выследить все 'shared_ptr' и удалить его? – Galik

+0

Не зная больше о вашей архитектуре, это невозможно сказать. Но мое чувство кишки использует исходный указатель здесь, вероятно, правильно. Однако мне интересно, как вы используете 'shared_ptr' для' Weapon'? Могут ли два объекта действительно иметь одно и то же оружие одновременно? – Galik

ответ

2

Если Environment имеет std::enable_shared_from_this<Environment> как родительский класс тогда, да. Просто позвоните envPtr->shared_from_this().

+0

Похоже, это может решить мою проблему. Собираясь экспериментировать с этим, приветствую. –

Смежные вопросы