C++使用new关键字创建带有初始化器的对象数组

3
我写了一个类,类似于这样(仅供演示):
class cls{
public:
    cls(int a):value(a){}
private:
    int value;
};

我想动态创建一个数组,每个元素都初始化为特定的值,比如2:

cls *arr = new cls[N](2);

但是g++报告了“error: parenthesized initializer in array new”的错误。

我在互联网上搜索,但只发现类似于基本类型(如intdouble)的问题,并且答案是否定的。

假设这个类必须被初始化,怎么解决这个问题?难道我必须放弃构造函数吗?


1
使用向量。无论如何,您都应该使用一个。 - chris
3个回答

6

您可以:

cls *arr = new cls[3] { 2, 2, 2 };

如果您使用std::vector,您可以:
std::vector<cls> v(3, cls(2));

或者

std::vector<cls> v(3, 2);

谢谢。我尝试使用向量并使用构造函数同时打印字符串。字符串只显示一次,但我检查了每个元素都已初始化。似乎向量只初始化一次,然后将其复制到其余对象中。 - CyberLuc
当您手动使用cls(2)并将其传递给向量初始化时,调用@Twisx构造函数。然后使用复制构造函数填充元素。 - keltar
@keltar 我明白了!谢谢! - CyberLuc

5

使用向量。

如果您坚持使用动态分配的数组而不是std::vector,则必须采用困难的方法:为数组分配一个内存块,然后逐个初始化所有元素。除非您真的无法使用向量,否则不要这样做!此仅用于教育目的。

cls* arr = static_cast<cls*>(::operator new[](N*sizeof(cls)));
for (size_t i = 0; i < N; i++) {
    ::new (arr+i) cls(2);
}
// ::delete[] arr;

谢谢,向量对我来说已经足够了。 - CyberLuc
谢谢你提供这个深奥的答案。在我的使用场景中,它对我非常有用:我需要一个指向对象数组的指针,这些对象缺少默认构造函数,以便将其排队到另一个线程中,在不再需要时销毁内存。如果使用vector,我将无法做到这一点。我承认这样做不太美观,但它能完成工作。 - mkrufky

1

你也可以使用向量

#include <vector>

using namespace std;

class cls{
public:
    cls(int a):value(a){}
private:
    int value;
};

int main() {

vector<cls> myArray(100, cls(2));

return 0;
}

这将创建一个包含100个cls对象的向量(数组),并初始化为2;


谢谢。我尝试使用向量并同时使用构造函数打印字符串。字符串只显示一次,但我检查了每个元素都已初始化。 - CyberLuc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接