2011-09-26 11 views
8

que estoy trabajando actualmente en un juego de cartas, y estoy teniendo problemas con algún código de inicialización:inicializar una matriz de objetos

// in my class... 
Card cards[20]; 
// in method... 
for(int i = 0; i <= 20;i++) 
    cards++ = new Card(i, /*i as char +*/ "_Card.bmp"); 

El problema es que mi compilador de que me dice que no es una cards++ l -valor. He leído toda la equivalencia de la matriz de punteros, y pensé que lo entendía, pero, por desgracia, no puedo hacer que funcione. Según entiendo, dado que cards se degrada a un puntero, y el operador new me da un puntero a la ubicación de mi nueva instancia de la tarjeta, entonces el código anterior debería compilarse. ¿Derecha?

He intentado usar un subíndice también, pero no es cards+i, cards++, y cards[i] ¿solo 3 formas de decir lo mismo? Pensé que cada uno de ellos eran l-valores y se tratan como punteros.

+1

tarjetas + devuelvo tarjetas + i; cards ++ incrementa las cartas en uno; las tarjetas [i] devuelven una referencia al elemento i-ésimo en las cartas. Todos son diferentes. –

Respuesta

15
Card cards[20]; 

cards ya es una matriz de objetos. Están construidos con el constructor predeterminado (constructor sin argumentos). No es necesario volver a new. Probablemente necesites una función miembro equivalente a los argumentos del constructor y asignarla a través de ella.

for (int i=0; i<20; ++i) // array index shouldn't include 20 
    cards[i].memberFunction(/*....*/); 

aún más simple es utilizar std::vector

std::vector<Card> cards; 
for(int i=0; i<20; ++i) 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp");) 
+0

Pensé que un vector sería una mejor idea. Así que traté de usar un vector, pero ahora estoy obteniendo algo en lo que me he estado metiendo mucho: una vez que incluí , obtengo una lista de errores de "externalidades no resueltas" de aspecto loco de libcpmtd.lib. Esto me dice que no hay nada malo con mi código, pero todavía no compilaré ... Uf. –

+1

Si desea usar std :: vector y ahora el número de elementos que se agregarán, NO USE push_back: la sobrecarga es pequeña pero evitable. Debe inicializar el vector en el tamaño correcto 'std :: vector cards (20);' y luego inicialice los miembros de la misma manera que lo hizo para la matriz. –

3

El código Card cards[20]; ya se crea una matriz de 20 Card objetos y les crea con el constructor por defecto. Esto puede no ser lo que quieres dado tu código.

Sugeriría usar vector en su lugar.

std::vector<Card> cards; 

for(int i = 0; i < 20;i++) 
{ 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp")); 
} 

Tenga en cuenta que su bucle for va 0-20 y por lo tanto uno más allá del final de la matriz.

0

Si desea evitar llamadas de constructor innecesarias y cambio de tamaño innecesario, entonces es más complicado, porque C++ normalmente inicializa cada objeto uno a uno según se asigna. Una solución es hacerlo de la manera de Java - utilizar un bucle y una matriz de punteros, así:

Card *cards[20]; 
for (int i=0; i<20; i++) { 
    cards[i] = new Card(i); 
} 

Otra opción es utilizar malloc para conseguir la memoria sin inicializar explícitamente:

Card *cards = malloc(20 * sizeof(Card)); 
for (int i=0; i<20; i++) { 
    new (&(cards[i])) Card(i); 
} 
Cuestiones relacionadas