een array van structs maken in c++

Ik probeer een array van structs te maken. Is onderstaande code geldig? Ik krijg steeds een expected primary-expression before '{'tokenfout.

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

Antwoord 1, autoriteit 100%

Probeer dit:

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

Antwoord 2, autoriteit 51%

Je kunt geen initialisatielijst gebruiken voor een structnadat deze is geïnitialiseerd. U heeft de twee Customer-structs al standaard geïnitialiseerd toen u de array customerRecordsdeclareerde. Daarom moet u ofwel de syntaxis voor lidtoegang gebruiken om de waarde van de niet-statische gegevensleden in te stellen, de structs te initialiseren met behulp van een lijst met initialisatielijsten wanneer u de array zelf declareert, of u kunt een constructor maken voor uw struct en gebruik de standaard operator=lidfunctie om de arrayleden te initialiseren.

Dus een van de volgende dingen zou kunnen werken:

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

Of als je een constructor voor je struct hebt gedefinieerd, zoals:

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

Je zou dan het volgende kunnen doen:

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

Of je zou de volgorde van initialisatielijsten kunnen maken die Tuomas in zijn antwoord gebruikte. De reden dat zijn initialisatielijst-syntaxis werkt, is omdat u de Customer-structs daadwerkelijk initialiseert op het moment van de declaratie van de array, in plaats van toe te staan dat de structs standaard worden geïnitialiseerd, wat plaatsvindt wanneer u declareer een geaggregeerde datastructuur zoals een array.


Antwoord 3, autoriteit 15%

Sommige compilers ondersteunen samengestelde letterlijke termen als extensie, waardoor deze constructie mogelijk is:

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

Maar het is nogal ondraagbaar.


Antwoord 4, autoriteit 14%

Het werkt perfect. Ik heb gcc-compiler C++11 gereed.
Probeer dit en je zult zien:

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

Other episodes