如何在为新数组分配数组时调用构造函数?在D中使用带数组的构造函数
例如,在下面的代码中,我将如何为每个A实例化调用构造函数,将b初始化为5,以表示所有10个元素?
void main() {
A[] a = new A[10];
}
class A {
int b;
this(int init) {
b = init;
}
}
我猜这是不可能的,但我希望能......
如何在为新数组分配数组时调用构造函数?在D中使用带数组的构造函数
例如,在下面的代码中,我将如何为每个A实例化调用构造函数,将b初始化为5,以表示所有10个元素?
void main() {
A[] a = new A[10];
}
class A {
int b;
this(int init) {
b = init;
}
}
我猜这是不可能的,但我希望能......
一个简单的循环应该做(和它是最可读的)
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)];
如果您正在处理值类型,则可以使用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)];
初始化但明确将只工作对于相对较小的阵列。
如果你真的想在一行中做到这一点,你可以写一个宏来为你做。我从其他答案中借用了实际初始化的代码。
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);
当然这有固定的构造函数的参数,但你也许可以做可变参数的东西模板和一些mixins生成正确的构造函数调用。