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 struct
nadat deze is geïnitialiseerd. U heeft de twee Customer
-structs al standaard geïnitialiseerd toen u de array customerRecords
declareerde. 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;
}