我有一个基类Base
,A
从中派生出来。
我想写这样的东西
Base *unsafeRelease() {
--_refCount;
return this;
}
...这样我就可以在unsafeRelease
子类的实例上调用Base
。
我认为问题在于,使用此代码将涉及所有预期案例中的向上转发和向下转发。我想以某种方式指定我将返回一个指向Base
子类实例的指针。这可能吗?
答案 0 :(得分:1)
从Base
导出std::enable_shared_from_this
并使用make_shared
分配您的对象
一个好的库的开销是2*sizeof(size_t)+sizeof(std::shared_ptr)
,没有额外的分配。
这允许您将原始指针分发为不透明的句柄并仍然恢复shared_ptr,并且它有效地处理了使用匹配的释放函数的要求。
您可以随时使用shared_ptr
或weak_ptr
。
另一种方法是在Release
中定义引用计数,函数AddRef
,Base
和虚拟析构函数,手动管理您的引用计数(请查看IUnknown
,所有COM类的基本接口。考虑让你的类派生自你的平台实现)。
关于instancetype
:typeid
- 运营商就是您想要的。你只需要至少一个虚函数就可以工作(在这种情况下,析构函数也应该是虚拟的,几乎在所有情况下都是如此)。