如何在构造函数初始值设定项列表中初始化“std::unique_ptr”对象的类成员“std::vector”
How do I initialize a class member `std::vector` of `std::unique_ptr` object in the constructor initializer list?
我的代码如下所示。
#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
。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 为什么 std::unique 不调用 std::sort?
- 我对 std::unique(算法)C++有问题
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- std::unique 是否有大小限制
- 从 std::unique 返回的迭代器的用法
- 使 std::unique<T> 与 std::unique<const T, CustomDeleterType 兼容>
- Std::list.unique()应该使迭代器无效
- 无法使用初始化器列表构造 vector<std::unique<...>>
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- 我能保证std::unique将保留第一个元素吗?
- 在 std::vector<std::unordered_set上使用 std::unique(<T>>