web-dev-qa-db-fra.com

création d'un tableau de structures en c ++

J'essaie de créer un tableau de structures. Le code ci-dessous est-il valide? Je reçois toujours un expected primary-expression before '{' erreur de jeton.

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

Essaye ça:

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

Vous ne pouvez pas utiliser une liste d'initialisation pour un struct après son initialisation. Vous avez déjà initialisé par défaut les deux structures Customer lorsque vous avez déclaré le tableau customerRecords. Par conséquent, vous devrez utiliser la syntaxe d'accès aux membres pour définir la valeur des membres de données non statiques, initialiser les structures à l'aide d'une liste de listes d'initialisation lorsque vous déclarez le tableau lui-même, ou vous pouvez créer un constructeur pour votre structure et utilisez la valeur par défaut operator= fonction membre pour initialiser les membres du tableau.

Donc, l'un des éléments suivants pourrait fonctionner:

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

Ou si vous avez défini un constructeur pour votre structure comme:

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

Vous pourriez alors faire:

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

Ou vous pouvez faire la séquence de listes d'initialisation que Tuomas a utilisée dans sa réponse. La raison pour laquelle sa syntaxe de liste d'initialisation fonctionne est parce que vous initialisez réellement les structures Customer au moment de la déclaration du tableau, plutôt que de permettre l'initialisation par défaut des structures qui a lieu chaque fois que vous déclarez un agréger la structure de données comme un tableau.

26
Jason

Certains compilateurs prennent en charge les littéraux composés comme une extension, permettant cette construction:

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

Mais c'est plutôt impossible à transporter.

8
Dave

Cela fonctionne parfaitement. J'ai le compilateur gcc C++ 11 prêt. Essayez ceci et vous verrez:

#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;
}
5
Mato