如何在具有受保护的析构函数和公共销毁方法的3d派对类上使用shared_ptr

丹尼尔·海尔珀

我是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章