[英]How do I initialize a std::unique_ptr with a deleter in a constructor?
[英]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 studio\vc\include\xmemory0 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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.