Я новичок в использовании unique_ptr и использовал его в некоторых частях своего кода. При попытке использовать unique_ptr у меня есть следующий код, который, похоже, не работает, может ли кто-нибудь объяснить мне, почему?
#include <vector>
#include <deque>
#include <memory>
class MyClass {
public:
MyClass(int x) {
myDeque.push_back(std::unique_ptr<int>(new int(x)));
}
private:
std::deque<std::unique_ptr<int>> myDeque;
};
int main() {
std::vector<MyClass> myVector;
myVector.push_back(MyClass(5));
}
Я хочу иметь deque из unique_ptr в классе и заполнять его из другой функции, и мне также нужно иметь вектор объектов класса MyClass. Код работает, когда я делаю myDeque глобальным, но выдает ошибку, когда это переменная-член.
уникальный указатель — это уникальный владелец некоторого ресурса. Копировать его нет смысла, потому что тогда он не будет уникальным. Что вы хотите, чтобы произошло, когда вы копируете MyClass
?
почему вы используете unique_ptr<int>
, а не только int
?
@ 463035818_is_not_a_number — это копирование или перемещение.
Он компилируется, если вы добавите в свой класс конструктор перемещения: MyClass(MyClass&&) = default;
Не могу объяснить, почему.
Если в MyClass есть move only
участников (например, unique_ptr
), весь класс может быть move only
. Для этого удалите конструктор копирования и оператор назначения, а также определите конструктор перемещения и оператор назначения.
class MyClass {
public:
MyClass(int x) {
myDeque.push_back(std::make_unique<int>(x));
}
MyClass(MyClass&&) = default;//move constructor
MyClass& operator=(MyClass&&) =default;//move assign operator
private:
MyClass(const MyClass&) = delete;// prevents creating copy
MyClass& operator=(const MyClass&) = delete;// prevents creating copy
std::deque<std::unique_ptr<int>> myDeque;
};
И не забудьте использовать std::move
, если вы нажимаете lvalue
на vector
int main() {
std::vector<MyClass> myVector;
MyClass q(5);
myVector.push_back(std::move(q));// since q is lvalue std::move required
myVector.push_back(MyClass(6));
}
Если вы хотите создать копии MyClass, определите правильный конструктор копирования и оператор назначения копии, где вы не пытаетесь скопировать unique_ptr, а только его разыменованное значение:
MyClass(const MyClass& to_copy) {
size_t copy_size = to_copy.myDeque.size();
for (size_t i = 0; i < copy_size; i++)
{
this->myDeque.push_back(std::make_unique<int>(*to_copy.myDeque[i]));
}
}
Какая ошибка???