在使用new?
分配数组时,如何调用构造函数?例如,在下面的代码中,如何为A的每个实例化调用构造函数,将b的所有10个元素初始化为5?
void main() {
A[] a = new A[10];
}
class A {
int b;
this(int init) {
b = init;
}
}
我猜这不可能,但我希望......
答案 0 :(得分:11)
一个简单的循环应该做(并且它是最可读的)
foreach(ref el;a){
el=new A(5);
}
或者您可以使用数组初始值设定项:
A[] a=[new A(5),new A(5),new A(5),new A(5),new A(5),
new A(5),new A(5),new A(5),new A(5),new A(5)];
答案 1 :(得分:4)
如果您正在处理值类型,则可以使用std.array.replicate。
auto a = replicate([5], 50);
将创建长度为50的int[]
,其中每个元素为5.您可以对引用类型执行相同操作,但所有元素都将引用相同的对象
auto a = replicate([new A(5)], 50);
只会调用A
的构造函数一次,最终会得到一个A[]
,其中所有元素都引用同一个对象。如果您希望它们引用单独的对象,您将需要单独设置每个元素
auto a = new A[](50);
foreach(ref e; a)
e = new A(5);
或用文字
初始化整个数组auto a = [new A(5), new A(5), new A(5)];
但这显然只适用于相对较小的阵列。
答案 2 :(得分:1)
如果您真的想在一行中完成,可以编写一个宏来为您完成。我从其他答案中借用了实际初始化的代码。
template allocate(T) {
T[] allocate(int size, int arg) {
T[] result = new T[size];
foreach(ref el; result)
el=new T(arg);
return result;
}
}
然后你可以一次分配10个元素的整个数组:
A[] a = allocate!(A)(10, 5);
当然这有固定的构造函数参数,但是您可以使用模板的可变参数和一些mixin来生成正确的构造函数调用。