gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:07:03 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com