在C++中创建一个结构体数组

34

我正在尝试创建一个结构体数组。下面的代码是否有效?我一直收到一个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;
}

1
你的示例在ideone(gcc-4.5.1)上编译没有错误 http://www.ideone.com/c9kMr - Praetorian
5
这是由于初始化列表中的新特性以及 C++0x ...,在 C++03 下,这段代码无法编译。 - Jason
5个回答

70

试试这个:

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

34

在初始化一个struct后,你不能再使用初始化列表。当你声明数组customerRecords时,已经对两个Customer结构体进行了默认初始化。因此,你必须使用成员访问语法来设置非静态数据成员的值,或者在声明数组本身时使用初始化列表的列表来初始化结构体,或者为你的结构体创建一个构造函数并使用默认的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结构体进行初始化,而不是允许结构体进行默认初始化,这种默认初始化会在您声明类似于数组这样的聚合数据结构时发生。


9

它完美地工作。我已经准备好了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;
}

9

一些编译器支持组合文字作为扩展,允许使用此结构:

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

但是它不太便携。


它是C99编写的,因此几乎不会“不可移植”(取决于您是否想支持古老的编译器)。我更喜欢用C语言来编写,而不是使用MakeCustomer(25, "Foo"),因为在GCC 4.2中它会生成更糟糕的代码。我记不清它是否是C ++编写的了;我非常确定(Customer){.uid=25}不是(尽管它可能是C++0x)。 - tc.
@tc.: MSVC(微软视觉 C++ 编译器)传统上忽略 C99 标准;MSVC 2008 是古董吗?(2010 年的版本好一点。) - Fred Nurk
如果过了十年,他们还不能把事情做好,那我觉得就是这样吧。再说了,就从风格方面来说,我认为大多数 Windows C 代码都已经成为了“遗留代码”。 - tc.

0

你可以使用向量。 首先定义结构体。

  struct Customer {
    int uid;
    string name;
  };

那么,

vector<Customer> array_of_customers;

通过使用向量,您将在结构数组中拥有更多的自由和访问权限。

现在,如果想要在定义的数组中添加一个结构元素,可以使用以下方法:

array_of_customer.push_pack(/* struct element here */)

例子:

Customer customer1;
customer1.uid = 01;
customer1.name = "John Doe";

Customer customer2;
customer2.uid = 02;
customer2.name = "Blah Blah";


array_of_customers.push_back(customer1);
array_of_customers.push_back(customer2);

你现在有一个结构体数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接