我是 A 类的客户,它的析构函数定义在 protected 。另外我不能改变它的界面(我故意写了“3'd 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
注意 现在析构函数如何实际上 受到保护
。这确保所有销毁都经过 FooBase::Deleter
关于c++ - 如何在具有 protected 析构函数和公共(public)销毁方法的 3 方类上使用 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657232/