Ответ 1
Попробуйте следующее:
Customer customerRecords[2] = {{25, "Bob Jones"},
{26, "Jim Smith"}};
Я пытаюсь создать массив структур. Является ли код ниже действительным? Я продолжаю получать токен expected primary-expression before '{'
.
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;
}
Попробуйте следующее:
Customer customerRecords[2] = {{25, "Bob Jones"},
{26, "Jim Smith"}};
Вы не можете использовать список инициализации для struct
после его инициализации. Вы уже по умолчанию инициализировали две структуры Customer
, когда вы объявили массив customerRecords
. Поэтому вы должны либо использовать синтаксис доступа к члену, чтобы установить значение нестатических членов данных, инициализировать структуры, используя список списков инициализации, когда вы объявляете сам массив, или вы можете создать конструктор для своей структуры и используйте функцию члена operator=
по умолчанию для инициализации элементов массива.
Так может работать любое из следующих:
Customer customerRecords[2];
customerRecords[0].uid = 25;
customerRecords[0].name = "Bob Jones";
customerRecords[1].uid = 25;
customerRecords[1].namem = "Jim Smith";
Или, если вы определили конструктор для своей структуры следующим образом:
Customer::Customer(int id, string input_name): uid(id), name(input_name) {}
Затем вы можете:
Customer customerRecords[2];
customerRecords[0] = Customer(25, "Bob Jones");
customerRecords[1] = Customer(26, "Jim Smith");
Или вы можете сделать последовательность списков инициализации, которые Туомас использовал в своем ответе. Причина, по которой его синтаксис инициализации-списка работает, состоит в том, что вы фактически инициализируете структуры Customer
во время объявления массива, вместо того, чтобы разрешать инициализацию инициализации структур, когда вы объявляете агрегированные данные, структура, подобная массиву.
Некоторые компиляторы поддерживают составные литералы как расширение, позволяя эту конструкцию:
Customer customerRecords[2];
customerRecords[0] = (Customer){25, "Bob Jones"};
customerRecords[1] = (Customer){26, "Jim Smith"};
Но он довольно неспособен.
Он отлично работает. У меня есть gcc-компилятор С++ 11 ready. Попробуйте это, и вы увидите:
#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;
}