在c ++中创建一个结构数组

时间:2011-07-25 00:16:34

标签: c++ arrays data-structures

我正在尝试创建一个结构数组。以下代码是否有效?我一直收到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 个答案:

答案 0 :(得分:43)

试试这个:

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

答案 1 :(得分:22)

初始化后,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");

或者您可以执行Tuomas在其答案中使用的初始化列表序列。他的初始化列表语法工作的原因是因为你实际上是在声明数组时初始化Customer结构,而不是允许结构默认初始化,这是在你声明聚合时发生的像数组一样的数据结构。

答案 2 :(得分:7)

某些编译器支持复合文字作为扩展,允许使用此构造:

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

但这是相当不可取的。

答案 3 :(得分:4)

完美无缺。我准备好了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;
}