gpt4 book ai didi

c++ - 如何使用 shared_ptr 并从 enable_shared_from_this 继承来制作克隆方法

转载 作者:可可西里 更新时间:2023-11-01 18:35:06 29 4
gpt4 key购买 nike

我已经看到编写返回 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 的注册需求克隆时。处理此问题的最佳方法是什么?

最佳答案

由于您已经通过非虚拟 Clone() 自己实现了公共(public) 接口(interface)协变函数,您可以考虑放弃 CloneImpl() 的协方差功能。

如果您只需要 shared_ptr 而不需要原始指针,那么您可以这样做:

class X
{
public:
shared_ptr<X> Clone() const
{
return CloneImpl();
}
private:
virtual shared_ptr<X> CloneImpl() const
{
return(shared_ptr<X>(new X(*this)));
}
};

class Y : public X
{
public:
shared_ptr<Y> Clone() const
{
return(static_pointer_cast<Y, X>(CloneImpl())); // no need for dynamic_pointer_cast
}
private:
virtual shared_ptr<X> CloneImpl() const
{
return shared_ptr<Y>(new Y(*this));
}
};

CloneImpl()总是会返回 shared_ptr<Base>现在你可以在 B::CloneImpl() 中注册你的对象了函数并返回注册的 shared_ptr。

关于c++ - 如何使用 shared_ptr 并从 enable_shared_from_this 继承来制作克隆方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655390/

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