作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我是一名优秀的程序员,十分优秀!