После публичного наследования enable_shared_from_this и инициализации объекта класса при вызове другой функции этого класса я все еще вижу пустой слабый указатель enable_shared_from_this_class при отладке в Visual Studio.
Все существующие вопросы связаны либо с частным наследованием от enable_shared_from_this, либо с вызовом weak_from_this в конструкторе. Это не относится ко мне. В настоящее время я использую структуру C++ catch для тестирования этого сценария в отладчике Visual Studio. В функции Initialize я вижу, что weak_ptr этого объекта пуст.
Заголовочный файл:
template <typename T>
class IInfo
public:
IInfo()
{}
virtual ~IInfo()
{}
virtual bool RegisterForChange(FUNC_PTR<T> Callback, std::weak_ptr<T>) = 0;
};
template <typename T>
class Info : public IInfo<T>, public std::enable_shared_from_this<Info<T>>
{
public:
Info() {}
~Info() {}
virtual bool RegisterForChange(FUNC_PTR<T> Callback, std::weak_ptr<T> callerContext) override
{
//Some code
_callerContext = callerContext;
}
private:
std::weak_ptr<T> _callerContext;
};
class Env : public std::enable_shared_from_this<Env>
{
public:
Env();
bool Initialize();
static void func(/ some arguments / );
private:
std::shared_ptr<Info<Env>>_spInfo;
//other variables
}
Файл CPP:
Env::Env() : _spInfo() // + other variables in initializer list
{
_spInfo = std::make_shared<Info<Env>>();
}
bool Env::Initialize()
{
_spInfo->RegisterForChange(FUNC_PTR<Env>func, this->weak_from_this());
}
ТЕСТ-СЛУЧАЙ: (используется фреймворк cpp catch)
Env env;
env.Initialize();
РЕДАКТИРОВАТЬ: Согласно комментариям, спрашивая правильно, модуль Env будет управляться плагином, который создаст unique_ptr и вызовет Initialize. Что-то типа:
template<typename T>
std::unique_ptr<T> BringUp()
{
std::unique_ptr<T> ptr(std::make_unique<T>());
if (ptr && ptr->Initialize())
return std::move(ptr);
}
std::unique_ptr<Env> _envPtr;
_envPtr = BringUp<Env>();
Я все еще сталкиваюсь с той же проблемой. Как мне управлять Env в этом случае?
std::enable_shared_from_this
предназначен для объектов, которыми управляетshared_ptr
,env
не управляется умным указателем - person 463035818_is_not_a_number   schedule 12.05.2019Env env;
Это уже проблема. Ваш класс не может просто наследовать отstd::enable_shared_from_this
. На самом деле его нужно создать и управлять им какstd::shared_ptr<Env>
. пример:auto env = std::make_shared<Env>(); env->Initialize();
- person WhozCraig   schedule 12.05.2019