2012-02-12 40 views
7

如何在为新数组分配数组时调用构造函数?在D中使用带数组的构造函数

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

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

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

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

回答

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)]; 
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)]; 

初始化但明确将只工作对于相对较小的阵列。

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); 

当然这有固定的构造函数的参数,但你也许可以做可变参数的东西模板和一些mixins生成正确的构造函数调用。