2011-07-25 28 views
12

Estoy tratando de crear una matriz de estructuras. ¿El código a continuación es válido? Sigo recibiendo un error de token expected primary-expression before '{'.creando una matriz de estructuras en C++

int main() { 
    int pause; 
    struct Customer { 
    int uid; 
    string name; 
    }; 

    Customer customerRecords[2]; 
    customerRecords[0] = {25, "Bob Jones"}; 
    customerRecords[1] = {26, "Jim Smith"}; 
    cin >> pause; 
    return 0; 
} 
+1

Su ejemplo se compila sin errores en Ideone (gcc-4.5.1) http://www.ideone.com/c9kMr – Praetorian

+4

Esto se debe a las nuevas características inherentes a la inicialización listas y C++ 0x ... su código no se compila bajo C++ 03. – Jason

Respuesta

34

Prueba esto:

Customer customerRecords[2] = {{25, "Bob Jones"}, 
           {26, "Jim Smith"}}; 
12

no puede utilizar una inicialización lista para un struct después de que haya sido inicializado. Ya ha inicializado por defecto las dos estructuras Customer cuando declaró la matriz customerRecords. Por lo tanto, tendrá que utilizar la sintaxis de acceso de miembro para establecer el valor de los miembros de datos no estáticos, inicializar las estructuras utilizando una lista de listas de inicialización cuando declare la matriz en sí, o puede crear un constructor para su estructura y use la función de miembro predeterminada operator= para inicializar los miembros de la matriz.

Así que cualquiera de los siguientes podría trabajar:

Customer customerRecords[2]; 
customerRecords[0].uid = 25; 
customerRecords[0].name = "Bob Jones"; 
customerRecords[1].uid = 25; 
customerRecords[1].namem = "Jim Smith"; 

O si ha definido un constructor para su estructura como:

Customer::Customer(int id, string input_name): uid(id), name(input_name) {} 

A continuación, podría hacer:

Customer customerRecords[2]; 
customerRecords[0] = Customer(25, "Bob Jones"); 
customerRecords[1] = Customer(26, "Jim Smith"); 

O podrías hacer la secuencia de listas de inicialización que Tuomas usó en su respuesta. La razón por la que funciona su sintaxis de lista de inicialización es porque en realidad está inicializando las estructuras Customer en el momento de la declaración de la matriz, en lugar de permitir que las estructuras se inicialicen por defecto cada vez que declare una estructura de datos agregada como una matriz.

+1

IMO esta debería ser la respuesta aceptada +1 – CapturedTree

7

Algunos compiladores soportan literales compuestos como una extensión, permitiendo esta construcción:

Customer customerRecords[2]; 
customerRecords[0] = (Customer){25, "Bob Jones"}; 
customerRecords[1] = (Customer){26, "Jim Smith"}; 

Pero es poco transportables.

+0

Está en C99, por lo que apenas es "no portátil" (dependiendo de si desea admitir compiladores antiguos o no). Lo prefiero en C a 'MakeCustomer (25," Foo ")' que de alguna manera genera un código peor con GCC 4.2. No puedo recordar si está en C++; Estoy bastante seguro de que '(Cliente) {.uid = 25}' no (aunque puede estar en C++ 0x). –

+0

@tc .: MSVC [tradicionalmente descuida C99] (http://stackoverflow.com/q/146419); ¿MSVC 2008 es una antigüedad? (2010 es un poco mejor.) –

+0

Si después de más de una década, no pueden molestarse, yo diría que sí. Por otra parte, considero que la mayoría de los códigos de Windows C son "heredados" en términos de estilo, al menos. –

4

Funciona perfectamente. Tengo el compilador gcc C++ 11 listo. Prueba esto y verá:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int pause; 

    struct Customer 
    { 
      int uid; 
      string name; 
    }; 

    Customer customerRecords[2]; 
    customerRecords[0] = {25, "Bob Jones"}; 
    customerRecords[1] = {26, "Jim Smith"}; 
    cout << customerRecords[0].uid << " " << customerRecords[0].name << endl; 
    cout << customerRecords[1].uid << " " << customerRecords[1].name << endl; 
    cin >> pause; 
return 0; 
} 
Cuestiones relacionadas