Если вы хотите сослаться на объект, который принадлежит в другом месте вашего кода, std::shared_ptr
- ваш путь к go (по крайней мере, если вы хотите добиться того, что вы показываете в примере, который это часть вашего вопроса). Затем, если вы хотите понизить базовый класс std::shared_ptr
до производного класса std::shared_ptr
, вы можете сделать следующее:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
int main() {
std::shared_ptr<Base> base = std::make_shared<Base>();
std::shared_ptr<Derived> derived = std::static_pointer_cast<Derived>(base);
return 0;
}
Кроме того, следующий код может имитировать c вашу ситуацию и то, что вы хотите добейтесь немного лучшего:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
std::unique_ptr<Base> const& get_unique_ptr() {
static std::unique_ptr<Base> base = std::make_unique<Base>();
return base;
}
int main() {
std::unique_ptr<Base> const& base = get_unique_ptr();
std::unique_ptr<Derived> derived(static_cast<Derived*>(base.get()));
return 0;
}
Обратите внимание, что приведенное выше решение может привести к нежелательному поведению повторного отпускания одного и того же указателя.