如何在具有受保护析构函数和公共销毁方法的 3'd 派对类上使用shared_ptr
How to use shared_ptr on a 3'd party class with protected destructor and public destroy method
我是一个类a的客户端,它的析构函数定义在protected中。此外,我不能改变它的接口(我故意写了"3d party class",尽管我的意思是,无论什么原因,你都不允许改变它的接口)。那么,在这种情况下如何使用boost::shared_ptr呢?析构函数是虚函数:
Class Foo {
public:
void Destroy () {}
protected:
virtual ~Foo () {}
}
对于Foo,它提供了一个"Destroy"方法
A直接使用下面的代码无法编译:
boost::shared_ptr <Foo> a = boost::make_shared <Foo> ();
编译器信息:...Foo::~Foo()不可访问…
而且,我工作场所的编译器不支持c++11
您可以创建一个中间类作为辅助器多态基:
示例仅使用c++03 Live On Coliru:
#include <boost/shared_ptr.hpp>
#include <iostream>
class Foo { // "abstract"
public:
virtual void Destroy () { std::cout << __FUNCTION__ << "n"; }
protected:
virtual ~Foo () {}
};
class FooBase : public Foo {
public:
static void Deleter(FooBase* p) {
if (p)
p->Destroy();
delete p;
}
// protected:
virtual ~FooBase() { std::cout << __FUNCTION__ << "n"; }
};
class FooDerived : public FooBase
{
~FooDerived() { std::cout << __FUNCTION__ << "n"; }
};
int main()
{
boost::shared_ptr<FooBase> p(new FooDerived, FooBase::Deleter);
}
打印:
Destroy
~FooDerived
~FooBase
注释析构函数现在如何实际是protected
。这确保了所有的析构都经过FooBase::Deleter
simple.
boost::shared_ptr<Foo> ptr(new Foo(), [](Foo *p){ p->Destroy(); });
回复结论:这是库设计模式不好的问题(抽象类的析构函数应该是public
…)所以你不能在这个库中使用shared_ptr
,或者你应该通过编辑库的头文件将析构函数更改为public
来使用shared_ptr
,即使它是那么坏
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr
- 唯一 ptr 将所有权移动到包含对象的方法