web-dev-qa-db-ja.com

C ++で構造体の配列を作成する

構造体の配列を作成しようとしています。以下のコードは有効ですか? 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;
}
17
user637965

これを試して:

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

structが初期化された後は、初期化リストを使用できません。配列Customerを宣言したときに、2つの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");

または、Tuomasが回答で使用した初期化リストのシーケンスを実行することもできます。彼の初期化リストの構文が機能する理由は、あなたが宣言するたびに起こる構造体をデフォルトで初期化するのではなく、実際に配列の宣言時にCustomer構造体を初期化しているからです配列のような集約データ構造。

26
Jason

一部のコンパイラーは、拡張として複合リテラルをサポートし、この構成を許可します。

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

しかし、それはかなりポータブルではありません。

8
Dave

完璧に機能します。 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;
}
5
Mato