2012-02-12 24 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生成正確的構造函數調用。