我在一个类上有一个方法可以使一个特定的实例成为一个" active"实例:
void makeActive() { activeInstance = this; }
但是,由于activeInstance
的类型为std::shared_ptr< ClassName >
,因此无法正常工作。如何将this
投射到std::shared_ptr<ClassName>
?
答案 0 :(得分:22)
如果您的对象已被shared_ptr
拥有,则可以通过让对象继承自std::enable_shared_from_this
shared_ptr
此代码将起作用:
void makeActive() { activeInstance = shared_from_this(); }
如果shared_ptr
您的对象尚未拥有,那么您确定不希望在makeActive()
中创建一个shared_ptr
当最后一个被销毁时,它会尝试删除你的对象。
答案 1 :(得分:3)
这将“有效”(但见下文):
activeInstance.reset(this);
问题是,意味着什么?当activeInstance
超出范围时,this
将为delete
d。这可能不是你想要的。您还应该阅读enable_shared_from_this
,这可以让您说:
activeInstance = shared_from_this();
另一个选择是使用“null deleter”,即指定一个什么都不做的删除函数:
void NoDelete(void*) {}
activeInstance.reset(this, NoDelete);
在许多情况下,这将是一个安全和正确的解决方案,假设this
将被其他地方的其他方法删除,而不是在activeInstance
的最后一次取消引用之前。