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

How to use shared_ptr on a 3'd party class with protected destructor and public destroy method

本文关键字:派对 ptr shared 受保护 析构函数 方法      更新时间:2023-10-16

我是一个类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,即使它是那么坏