标量初始化程序错误周围的大括号

时间:2017-06-09 15:25:09

标签: c++ struct initializer-list curly-braces

我有这两种结构

[u'ATP', u'Start Date', u'Tournament', u'Venue', u'Location', u'Series', u'Court', u'Surface', u'Players']

我想初始化一个由struct vino_t { int tip; char *sorta; int godina; int cena; }; struct vinarija_t { char *ime_vinarija; char lokacija[50]; int kolku_vina; vino_t *lista_vina; int zarabotka; int nagradi; } 类型的三个元素组成的数组(第二个结构)。

我的列表是这样的

vinarija_t

我不断得到错误:在类型vinarija_t lista_vinar[3] = { {"Bovin", "Negotino", 3, {{1, "zhilavka", 2015, 850},{1, "rkaciteli", 2017, 700},{2, "kratoshija", 2009, 900}},2450,4}, {"Tikvesh", "Kavadarci", 3,{{2, "vranec", 2016, 750},{1, "smedervka", 2007, 1000},{3, "zinfandel", 2014, 850}},2600,3}, {"Dalvina", "Bosilovo", 3,{{2, "barbera", 2002, 1200},{3, "merlo", 2017, 850},{3, "malbek", 2016, 700}},2750,5} }; 的标量初始值设定项周围。我尝试更换大括号,添加它们,删除它们,但不知何故没有解决我的问题。

1 个答案:

答案 0 :(得分:2)

vinarija_t中,lista_vinavino_t *。由于它是一个指针,因此只能使用单个值进行初始化(指针只保存一个地址)。如果您需要数组,则需要将lista_vina更改为vino_t lista_vina[3];

话虽如此,你可能不希望如此。如果你想要一个可以是任何大小的数组,那么你真正想要的是std::vector<vino_t>std::vector可以从初始化列表构建,它​​还可以为您管理内存。

另请注意,您对字符串文字的所有char*都是非法的。字符串文字的类型为const char[N],因此无法存储在char*中。您应该考虑使用std::string。做出所有这些改变会给你

struct vino_t {
    int tip;
    std::string sorta;
    int godina;
    int cena;
};

struct vinarija_t {
    std::string ime_vinarija;
    std::string lokacija;
    int kolku_vina;
    std::vector<vino_t> lista_vina;
    int zarabotka;
    int nagradi;
};

这还有一个额外的好处,即您的类现在可以完全移动和复制构造,而无需编写单行代码。