我是A类的客户端,它的析构函数在protected中定义。此外,我无法更改其界面(我故意写了“ 3'd party class”,尽管我的意思是出于任何原因,都不允许您更改其界面。因此,在这种情况下如何使用boost :: shared_ptr ?析构函数是虚拟的:
Class Foo {
public:
void Destroy () {}
protected:
virtual ~Foo () {}
}
对于Foo,它提供了一种“销毁”方法
直接用法不会编译以下代码:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句