creando una matriz de estructuras en c ++

3 minutos de lectura

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;
}

  • 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

Prueba esto:

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

Avatar de usuario de Jason
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;
}

Avatar de usuario de Jesimiel Almedejar
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.

¿Ha sido útil esta solución?