在D中使用带数组的构造函数

时间:2012-02-12 15:06:13

标签: arrays constructor d dynamic-arrays

在使用new?

分配数组时,如何调用构造函数?

例如,在下面的代码中,如何为A的每个实例化调用构造函数,将b的所有10个元素初始化为5?

void main() {
    A[] a = new A[10];
}

class A {
    int b;
    this(int init) {
        b = init;
    }
}

我猜这不可能,但我希望......

3 个答案:

答案 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来生成正确的构造函数调用。