(CloneImpl ()));
... Я видел, что полезный способ написать метод клонирования, который возвращает boost :: shared_ptr, - это сделать
class A
{
public:
shared_ptr Clone() const
{
return(shared_ptr(CloneImpl()));
}
protected:
virtual A* CloneImpl() const
{
return(new A(*this));
}
};
class B : public A
{
public:
shared_ptr Clone() const
{
return(shared_ptr(CloneImpl()));
}
protected:
virtual B* CloneImpl() const
{
return(new B(*this));
}
};
Это позволяет использовать ковариацию с обычным указателем, при этом сохраняя его в безопасности умный указатель. Моя проблема в том, что мой класс B должен унаследовать от boost :: enable_shared_from_this, потому что сразу после построения ему необходимо зарегистрировать себя в отдельном классе, передавая себе общий указатель. У меня есть метод Create, который объединяет построение и регистрацию, чтобы они всегда происходили вместе. Однако приведенная выше реализация метода клонирования не может удовлетворить это требование. Регистрация не может происходить в CloneImpl, так как shared_ptr еще не существует, "владеющего" объектом, предотвращая вызов shared_from_this (), и если этой логики нет в виртуальной функции, то shared_ptr, указывающий на B, не знает о необходимости регистрации B при клонировании. Как лучше всего решить эту проблему?