【发布时间】:2010-09-07 02:35:17
【问题描述】:
我已经看到编写一个返回 boost::shared_ptr 的克隆方法的有用方法是这样做
class A
{
public:
shared_ptr<A> Clone() const
{
return(shared_ptr<A>(CloneImpl()));
}
protected:
virtual A* CloneImpl() const
{
return(new A(*this));
}
};
class B : public A
{
public:
shared_ptr<B> Clone() const
{
return(shared_ptr<B>(CloneImpl()));
}
protected:
virtual B* CloneImpl() const
{
return(new B(*this));
}
};
这允许使用与常规指针的协方差,同时仍将其包装在智能指针的安全性中。我的问题是我的 B 类需要从 boost::enable_shared_from_this 继承,因为在构造之后它需要立即向一个单独的类注册自己,并将一个共享指针传递给它自己。我有一个包装构造和注册的 Create 方法,以确保它们总是一起发生。然而,上面的克隆方法实现不能处理这个要求。注册不能在 CloneImpl 中发生,因为尚不存在“拥有”该对象的 shared_ptr,从而阻止了对 shared_from_this() 的调用,并且如果此逻辑不在虚函数中,则指向 B 的 shared_ptr 不知道 B 的注册需求克隆时。处理这个问题的最佳方法是什么?
【问题讨论】:
-
这段代码能编译吗?看起来 B::Clone() 隐藏了 A::Clone()。
-
这个例子是为我编译的。我相信 B::Clone() 隐藏 A::Clone() 是有目的的,以便您获得正确的返回类型。
标签: c++ shared-ptr