当类具有unique_ptr类型的deque时,将类的vector对象压入



我对使用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));
}

我希望在一个类中有一个unique_ptr的deque,并将从另一个函数填充它,我还需要有一个MyClass的类对象的向量。当我将myDeque设置为全局变量时,代码可以工作,但当它是成员变量时抛出错误。

如果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;
};

如果您将lvalue推到vector,请记住使用std::move

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]));
}
}

最新更新