я видел, что полезный способ, чтобы написать метод клонирования, который возвращает повышение :: shared_ptr это сделатьКак сделать метод клонирования с помощью shared_ptr и наследующий enable_shared_from_this
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, который завершает создание и регистрацию, чтобы убедиться, что они всегда встречаются вместе. Однако описанная выше реализация метода clone не может справиться с этим требованием. Регистрация не может произойти в CloneImpl, так как no shared_ptr еще не существует, «владея» объектом, предотвращая вызов shared_from_this(), и если эта логика не находится в виртуальной функции, то shared_ptr, указывающий на B, не знает о требованиях регистрации B при клонировании. Каков наилучший способ справиться с этой проблемой?
Скомпилирует ли этот код? Похож B :: Clone() скрывает A :: Clone(). –
Этот пример составлен для меня. Я считаю, что целесообразна, что B :: Clone() скрывает A :: Clone(), чтобы получить правильный тип возврата. – user334066