Estoy tratando de crear una matriz de estructuras. ¿Es válido el siguiente código? sigo recibiendo un expected primary-expression before '{'
error de token
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;
}
Prueba esto:
Customer customerRecords[2] = {{25, "Bob Jones"},
{26, "Jim Smith"}};
jason
No puede usar una lista de inicialización para un struct
después de haber sido inicializado. Ya ha inicializado por defecto los dos Customer
estructuras cuando declaró la matriz customerRecords
. Por lo tanto, tendrá que usar la sintaxis de acceso a miembros para establecer el valor de los miembros de datos no estáticos, inicializar las estructuras usando una lista de listas de inicialización cuando declare la matriz en sí, o puede crear un constructor para su estructura y usa el predeterminado operator=
función de miembro para inicializar los miembros de la matriz.
Así que cualquiera de los siguientes podría funcionar:
Customer customerRecords[2];
customerRecords[0].uid = 25;
customerRecords[0].name = "Bob Jones";
customerRecords[1].uid = 25;
customerRecords[1].namem = "Jim Smith";
O si definió un constructor para su estructura como:
Customer::Customer(int id, string input_name): uid(id), name(input_name) {}
Entonces podrías hacer:
Customer customerRecords[2];
customerRecords[0] = Customer(25, "Bob Jones");
customerRecords[1] = Customer(26, "Jim Smith");
O podría 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ás inicializando el Customer
estructuras en el momento de la declaración de la matriz, en lugar de permitir que las estructuras se inicialicen por defecto, lo que ocurre cada vez que declara una estructura de datos agregada como una matriz.
Algunos compiladores admiten literales compuestos como una extensión, lo que permite esta construcción:
Customer customerRecords[2];
customerRecords[0] = (Customer){25, "Bob Jones"};
customerRecords[1] = (Customer){26, "Jim Smith"};
Pero es bastante unportable.
-
Está en C99, por lo que apenas es “inportátil” (dependiendo de si desea admitir compiladores antiguos o no). lo prefiero en C a
MakeCustomer(25, "Foo")
que de alguna manera genera peor código con GCC 4.2. No recuerdo si está en C++; Estoy bastante seguro(Customer){.uid=25}
no lo es (aunque puede estar en C++ 0x).– tc.
25 de julio de 2011 a las 0:47
-
@tc.: MSVC tradicionalmente descuida C99; ¿MSVC 2008 es una antigüedad? (2010 es un poco mejor.)
– Fred Nurk
25 de julio de 2011 a las 1:02
-
Si después de más de una década, no se les puede molestar, lo diría. Por otra parte, considero que la mayoría de los códigos de Windows C son “heredados” en términos de estilo, al menos.
– tc.
25 de julio de 2011 a las 1:10
Funciona perfectamente. Tengo el compilador gcc C++11 listo. Prueba esto y verás:
#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;
}
Jesimiel Almedéjar
puedes usar vectores. Primero defina la estructura.
struct Customer {
int uid;
string name;
};
Entonces,
vector<Customer> array_of_customers;
Al usar el vector, tendrá más libertad y acceso a la matriz de estructura.
Ahora, si desea agregar un elemento de estructura en la matriz definida. Puedes usar
array_of_customer.push_pack(/* struct element here */)
Ejemplo:
Customer customer1;
customer1.uid = 01;
customer1.name = "John Doe";
Customer customer2;
customer2.uid = 02;
customer2.name = "Blah Blah";
array_of_customers.push_back(customer1);
array_of_customers.push_back(customer2);
ahora tienes una matriz de estructura.
Su ejemplo se compila sin errores en ideone (gcc-4.5.1) ideone.com/c9kMr
– Pretoriano
25 de julio de 2011 a las 0:24
Esto se debe a las nuevas características inherentes a las listas de inicialización y C++0x… su código no compila bajo C++03.
– Jasón
25 de julio de 2011 a las 0:37