如何在构造函数初始值设定项列表中初始化“std::unique_ptr”对象的类成员“std::vector”

How do I initialize a class member `std::vector` of `std::unique_ptr` object in the constructor initializer list?

本文关键字:std unique ptr 对象 vector 成员 初始化 构造函数 列表      更新时间:2023-10-16

我的代码如下所示。

#include <memory>
#include <stdint.h>
class APodClass
{
    public:
        int x, y, z;
};
class MyClass
{
    public:
        MyClass(uintmax_t Width, uintmax_t Height)
            :   WIDTH   (Width),
                HEIGTH  (Height),
                Field   (WIDTH * HEIGTH, nullptr)
        {
        }
    private:
        const uintmax_t WIDTH;
        const uintmax_t HEIGTH;
        std::vector<std::unique_ptr<APodClass>> Field;
};
int wmain(int argc, wchar_t * argv[])
{
    MyClass MyObject(1000, 500);
    return 0;
}

当我尝试编译它时,出现以下错误。

Error C2280
'std::unique_ptr<APodClass,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
...visual studiovcincludexmemory0   655

我在这里做错了什么。如何修复此代码?

std::unique_ptr 不可复制,因此任何复制元素的构造函数或算法(如 std::generate )都不起作用:

class MyClass
{
    static std::vector<std::unique_ptr<APodClass>> generate(size_t sz)
    {
        std::vector<std::unique_ptr<APodClass>> result;
        result.reserve(sz);
        for (size_t i = 0 ; i < sz ; ++i)
            result.emplace_back(nullptr);
        return result;
    }
public:
    MyClass(uintmax_t Width, uintmax_t Height)
    :   WIDTH   (Width),
    HEIGTH  (Height),
    Field   (generate(WIDTH * HEIGTH))
    {
    }
...
};

如您所见,您正在使用的构造函数vector(size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());会复制val参数。

如您所知,unique_ptr是不可复制的。因此,您不能使用复制参数的构造函数。

您可以做的是将向量初始化为空。默认初始化就足够了,因此根本不需要使用成员初始化列表。要将n不可复制的元素添加到空向量中,可以在 MyClass 的构造函数主体中使用循环和push_back