如何在爲新數組分配數組時調用構造函數?在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生成正確的構造函數調用。