Как правильно использовать вектор unique_ptrs при сохранении полиморфизма? - PullRequest
1 голос
/ 06 июля 2019

Я пытаюсь создать vector из unique_ptr s, которые будут управлять группой объектов, которые все наследуются от одного и того же родительского объекта.

Так, например:

Класс A (родитель) -> Класс B (ребенок A) -> Класс C (ребенок B)

std::vector<std::unique_ptr<A>> all_objs_;

Итак, я знаю, что для добавления объектов к этому vector я должен создать так:

std::unique_ptr<C> tmp_obj(new C());

all_objs_.push_back( std::move(tmp_obj) );

Пока все работает хорошо. На самом деле он правильно перемещает все переменные в C.

Однако, хотя я включил конструкторы копирования, назначение копирования, конструкторы перемещения, функции перемещения в каждый из 3 моих классов, они на самом деле не вызывают при выполнении std :: move.

Я проверил это, добавив std::cout << "test\n"; к каждой из четырех функций. А также, пытаясь изменить некоторую произвольную переменную.

Мои функции назначения / копирования перемещения выглядят следующим образом:

A& A::operator=(const A&& other) { std::cout << "test\n";}
A::A::(const A&& other) { std::cout << "test\n";}

B& B::operator=(const B&& other) { std::cout << "test\n";}
B::B(const B&& other) : A(other) { std::cout << "test\n";}

C& C::operator=(const C&& other) { std::cout << "test\n";}
C::C(const C&& other) : B(other) { std::cout << "test\n";}

Также пытались создать функции назначения / копирования перемещения следующим образом:

A& A::operator=(const std::unique_ptr<A>&& other) {std::cout << "test\n";}
A::A(const std::unique_ptr<A>&& other) {std::cout << "test\n";}

Итак, хотя мой код технически работает, я понятия не имею, как и почему. Также при полном удалении функций перемещения я получаю ошибки.

...