2012-02-12 17 views
7

Làm thế nào để bạn gọi các hàm tạo khi phân bổ một mảng với mới?Sử dụng các hàm tạo với các mảng trong D

Ví dụ, trong đoạn mã sau, làm cách nào tôi gọi hàm tạo cho mỗi lần khởi tạo A, khởi tạo b đến 5 cho tất cả 10 phần tử?

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

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

Tôi đoán đó là không thể, nhưng tôi có thể hy vọng ...

Trả lời

11

một vòng lặp đơn giản nên làm (và đó là có thể đọc được hầu hết)

foreach(ref el;a){ 
    el=new A(5); 
} 

hoặc bạn có thể sử dụng mảng initializer:

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

Nếu bạn đang xử lý loại giá trị, bạn có thể sử dụng std.array.replicate.

auto a = replicate([5], 50); 

sẽ tạo ra một int[] chiều dài 50 nơi mà mỗi phần tử là 5. Bạn có thể làm tương tự với một loại tài liệu tham khảo, nhưng tất cả các yếu tố sẽ đề cập đến cùng một đối tượng.

auto a = replicate([new A(5)], 50); 

sẽ chỉ gọi constructor A 's một lần, và bạn sẽ kết thúc với một A[] nơi mà tất cả các yếu tố tham khảo cùng một đối tượng. Nếu bạn muốn họ tham khảo đối tượng riêng biệt, bạn đang hoặc sẽ phải thiết lập từng yếu tố riêng lẻ

auto a = new A[](50); 
foreach(ref e; a) 
    e = new A(5); 

hoặc khởi tạo toàn bộ mảng với một chữ

auto a = [new A(5), new A(5), new A(5)]; 

Nhưng điều đó rõ ràng sẽ chỉ làm việc cho các mảng tương đối nhỏ.

1

Nếu bạn thực sự muốn làm điều đó trong một dòng, bạn có thể viết macro để làm điều đó cho bạn. Tôi đã mượn mã cho việc khởi tạo thực tế từ các câu trả lời khác.

template allocate(T) { 
    T[] allocate(int size, int arg) { 
     T[] result = new T[size]; 
     foreach(ref el; result) 
      el=new T(arg); 
     return result; 
    } 
} 

Sau đó, bạn có thể phân bổ toàn bộ một mảng của 10 nguyên tố cùng một lúc với:

A[] a = allocate!(A)(10, 5); 

Tất nhiên điều này đã cố định đối số nhà xây dựng, nhưng bạn có thể có thể làm điều gì đó với đối số variadic vào mẫu và một số mixins để tạo cuộc gọi hàm tạo chính xác.