使用构造函数定义 class 对象的 unique_ptr 数组的正确语法
Proper syntax for defining a unique_ptr array of class objects with a constructor
我想要一个包含 class 个对象的数组 unique_ptr
:
std::unique_ptr<MyClass[]> arr(new MyClass[n]);
MyClass
没有默认构造函数(在我的例子中不应该有),所以我必须在这里明确说明。我不知道该怎么做,所以它在语法上是正确的。使用显式初始化编写 class 对象的 unique_ptr
数组的正确方法是什么?
澄清
我有一个 MyClass
的非默认构造函数,像这样:
MyClass instance(arguments);
除了成员初始化之外,构造函数中也有一些计算。我想创建一个包含 MyClass
个实例的 unique_ptr
数组,并为每个实例调用构造函数。我以后不能这样做,因为 MyClass
没有默认构造函数。我可以把 (arguments)
放在 std::unique_ptr<MyClass[]> arr(new MyClass[n])
的某个地方吗?
下面的答案基于问题的先前版本,其中数组大小似乎是一个 compile-time 常量。如果创建的数组的大小不是 compile-time 常量,则不可能将参数传递给元素的构造函数。在那种情况下,std::vector
可能是比 array-std::unique_ptr
.
更好的选择
对于数组,它的工作方式与往常一样,使用聚合初始化:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
{...},
{...},
{...},
{...},
{...}});
其中 ...
替换为五个元素的构造函数的参数列表。
或者如果您不能对元素使用 list-initialization,例如因为那会无意中使用 std::initializer_list
构造函数:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...)});
std::make_unique
通常是创建 std::unique_ptr
的首选,但目前没有允许将参数传递给各个数组元素的构造函数的重载。
如果您想将相同的参数列表传递给每个元素,假设类型为 copy-constructible,一个简单的解决方案是声明一个实例,然后 copy-construct 来自该实例的元素:
MyClass instance(arguments);
std::unique_ptr<MyClass[]> arr(new MyClass[]{instance, instance, instance, instance, instance);
否则你可以编写一个模板函数来为你扩展这些重复的项目。 (稍后可能会添加示例。)
我想要一个包含 class 个对象的数组 unique_ptr
:
std::unique_ptr<MyClass[]> arr(new MyClass[n]);
MyClass
没有默认构造函数(在我的例子中不应该有),所以我必须在这里明确说明。我不知道该怎么做,所以它在语法上是正确的。使用显式初始化编写 class 对象的 unique_ptr
数组的正确方法是什么?
澄清
我有一个 MyClass
的非默认构造函数,像这样:
MyClass instance(arguments);
除了成员初始化之外,构造函数中也有一些计算。我想创建一个包含 MyClass
个实例的 unique_ptr
数组,并为每个实例调用构造函数。我以后不能这样做,因为 MyClass
没有默认构造函数。我可以把 (arguments)
放在 std::unique_ptr<MyClass[]> arr(new MyClass[n])
的某个地方吗?
下面的答案基于问题的先前版本,其中数组大小似乎是一个 compile-time 常量。如果创建的数组的大小不是 compile-time 常量,则不可能将参数传递给元素的构造函数。在那种情况下,std::vector
可能是比 array-std::unique_ptr
.
对于数组,它的工作方式与往常一样,使用聚合初始化:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
{...},
{...},
{...},
{...},
{...}});
其中 ...
替换为五个元素的构造函数的参数列表。
或者如果您不能对元素使用 list-initialization,例如因为那会无意中使用 std::initializer_list
构造函数:
std::unique_ptr<MyClass[]> arr(new MyClass[]{
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...),
MyClass(...)});
std::make_unique
通常是创建 std::unique_ptr
的首选,但目前没有允许将参数传递给各个数组元素的构造函数的重载。
如果您想将相同的参数列表传递给每个元素,假设类型为 copy-constructible,一个简单的解决方案是声明一个实例,然后 copy-construct 来自该实例的元素:
MyClass instance(arguments);
std::unique_ptr<MyClass[]> arr(new MyClass[]{instance, instance, instance, instance, instance);
否则你可以编写一个模板函数来为你扩展这些重复的项目。 (稍后可能会添加示例。)