2012-02-12 8 views
7

¿Cómo se llaman constructores al asignar una matriz con nueva?Uso de constructores con matrices en D

Por ejemplo, en el siguiente código, ¿cómo llamaría al constructor para cada instancia de A, inicializando b a 5 para los 10 elementos?

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

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

supongo que no es posible, pero lo que puedo esperar ...

Respuesta

11

un simple bucle debe hacer (y que es la más legible)

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

o puede utilizar la inicializador de matriz:

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

Si se trata de un tipo de valor, puede usar std.array.replicate.

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

crearía una int[] de longitud 50, donde cada elemento es 5. puede hacer lo mismo con un tipo de referencia, pero todos los elementos se va a hacer referencia al mismo objeto.

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

sólo habrá llamada al constructor A 's una vez, y que va a terminar con un A[] donde todos los elementos se refieren al mismo objeto. Si usted quiere que se refieren a objetos separados, que está bien va a tener que configurar cada elemento individual

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

o inicializar toda la matriz con un literal

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

pero que será claramente único trabajo para arreglos relativamente pequeños.

1

Si realmente desea hacerlo en una línea, puede escribir una macro para que lo haga por usted. He tomado prestado el código para la inicialización real de las otras respuestas.

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

A continuación, puede asignar todo un conjunto de 10 elementos a la vez con:

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

Por supuesto, esto ha fijado argumentos de constructor, pero probablemente podría hacer algo con argumentos variadic a la plantilla y algunos mixins para generar la llamada de constructor correcta.