создание массива структур в с ++ - PullRequest
16 голосов
/ 25 июля 2011

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

Ответы [ 4 ]

46 голосов
/ 25 июля 2011

Попробуйте это:

Customer customerRecords[2] = {{25, "Bob Jones"},
                               {26, "Jim Smith"}};
24 голосов
/ 25 июля 2011

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

8 голосов
/ 25 июля 2011

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

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

Но это довольно непереносимо.

5 голосов
/ 22 апреля 2016

Работает отлично.У меня есть компилятор gcc C ++ 11 готов.Попробуйте это, и вы увидите:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...