2011-05-26 11 views
8

no predeterminada Si tengo:C++: asignar dinámicamente una matriz miembro de estructuras utilizando el constructor

struct a_struct 
{ 
    int an_int; 

    a_struct(int f) : an_int(f) {} 
    a_struct() : an_int(0) {} 
}; 

class a_class 
{ 
    a_struct * my_structs; 

    a_class() {...} 
}; 

que puedo hacer:

a_class() {my_structs = new a_struct(1)} 
//or 
a_class() {my_structs = new a_struct [10]} 

Pero no puedo hacer:

a_class() {my_structs = new a_struct(1) [10]} 
//or 
a_class() {my_structs = new a_struct() [10]} 

¿Hay alguna sintaxis correcta para que esto funcione? ¿O un trabajo fácil?

Respuesta

5

Si usa el STL es una opción, puede usar std :: vector en lugar de una matriz dinámica.

I pensar que esto va a funcionar:

std::vector<a_struct> my_structs; 

my_structs.assign(10, 1); 

Si no, esto debe:

my_structs.assign(10, a_struct(1)); 
+2

O sólo 'std :: vector my_structs (10, 1); ' – Nemo

0

Se podría utilizar un vector de punteros a punteros. A continuación, puede crear la matriz que contendrá punteros a a_struct(), para que pueda decidir después qué constructor de empleo:

class a_class { 
    a_struct ** my_structs; 

    a_class() { my_structs = new a_struct* [10]} 
    void foo() { 
     my_structs[0] = new a_struct(1); 
     my_structs[5] = new a_struct("some string and float constructor", 3.14); 
    } 
}; 
+0

Esto no le permite pasar una serie de estructuras (o un puntero a la estructura y luego utilizar el puntero matemático para pasar al siguiente elemento de la matriz). – iheanyi

0

Usted no puede hacerlo directamente en cualquier constructor parametrizado en particular. Sin embargo se puede hacer,

a_struct *my_struct[10] = {}; // create an array of pointers 

for (int i = 0; i < 10; i++) 
    my_struct[i] = new a_struct(i); // allocate using non-default constructor 

cuando se va a de-asignar la memoria,

for (int i = 0; i < 10; i++) 
    delete my_struct[i] // de-allocate memory 

sugiere emplear un recipiente std::vector lugar de pasar por este proceso.

+1

La ventaja de 'std :: vector' en este caso es que todos los' my_struct's estarán en un bloque de memoria contiguo. – Xeo

+0

Esto no le permite pasar una serie de estructuras (o un puntero a la estructura y luego usar la función de puntero para pasar al siguiente elemento de la matriz) – iheanyi

3

Se puede asignar un trozo en bruto de la memoria y utilizar la colocación nueva para inicializar cada struct:

int number_of_structs = 10; 
my_structs = (a_struct*)new unsigned char[sizeof(a_struct) * number_of_structs]; 
    // allocate a raw chunk of memory 
a_struct* p = m_structs; 
for (int i=0; i<number_of_structs; i++) 
{ 
    new (p) a_struct(i); 
    p++; 
} 

Ver también: What uses are there for "placement new"?

Cuestiones relacionadas