c++ - 如何在具有 protected 析构函数和公共(public)销毁方法的 3 方类上使用 shared_ptr

标签 c++ boost destructor shared-ptr protected

我是 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/

相关文章:

c++ - boost::filesystem v3 - 路径的正确大小写

c++ - 在 Windows VC++ 2010 静态链接下构建 boost + ICU

c++ - boost::shared_ptr 断言错误与 boost::asio:io_service

c++ - 奇怪的对象分配行为 c++

c# - 我应该将 Entity Framework 视为非托管资源吗?

c++ - 如何在 C++ 中对 exec() 进行析构函数友好调用?

c++ - 逐行读取文本文件(带整数)并将每一行存储为 vector (C++)

c++ - memcpy vs for 循环 - 从指针复制数组的正确方法是什么?

c++ - 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符

C++重载解析问题