Подтвердить что ты не робот

Создание массива структур в С++

Я пытаюсь создать массив структур. Является ли код ниже действительным? Я продолжаю получать токен 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;
}
4b9b3361

Ответ 1

Попробуйте следующее:

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

Ответ 2

Вы не можете использовать список инициализации для 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 во время объявления массива, вместо того, чтобы разрешать инициализацию инициализации структур, когда вы объявляете агрегированные данные, структура, подобная массиву.

Ответ 3

Некоторые компиляторы поддерживают составные литералы как расширение, позволяя эту конструкцию:

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

Но он довольно неспособен.

Ответ 4

Он отлично работает. У меня есть 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;
}