c++ 当类具有unique_ptr的双端队列时,将对象推入类的向量

jfewjypa  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(111)

我对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全局时,代码工作,但当它是一个成员变量时,会抛出错误。

pw9qyyiw

pw9qyyiw1#

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

相关问题