Когда у класса есть unique_ptr базового класса, это хороший способ реализовать конструктор копирования.
Попробую объяснить на примере:
struct Base
{
virtual void doSth() = 0; // to make the class abstract.
};
struct Derived : public Base
{
virtual void doSth() override {}
};
struct Foo
{
std::unique_ptr<Base> bar;
Foo(const Foo& other) : bar(new Base(*other.bar)) // cant do it, its abstract.
{
bar = std::move(other.bar); // cant do it, reference object is modified.
}
};
Здесь, поскольку класс является абстрактным, я не могу использовать его конструктор копирования. а также не может использовать перемещение по постоянной ссылке (на самом деле мы не должны этого делать, не изменяйте объект).
В итоге я получаю так:
struct Base
{
virtual void doSth() = 0; // to make the class abstract.
};
struct Derived : public Base
{
virtual void doSth() override {}
Derived(const Base* b)
{
}
};
struct Foo
{
std::unique_ptr<Base> bar;
Foo(const Foo& other) : bar(new Derived(other.bar.get()))
{
}
};
Однако это кажется не совсем правильным, не так ли?
clone()
. - person n. 1.8e9-where's-my-share m.   schedule 18.05.2014