聚合对象应使用“...”进行初始化
Posted
技术标签:
【中文标题】聚合对象应使用“...”进行初始化【英文标题】:initialization with '...' expected for aggregate object聚合对象应使用“...”进行初始化 【发布时间】:2013-12-08 14:30:19 【问题描述】:我正在尝试进行字符串解析(事实证明这是一个巨大的痛苦)。我收到此错误:“聚合对象需要使用 '...' 进行初始化”
我有一个这样定义的元素:
Element * currentBar = new Element("Bar");
我想制作一个数组或其他东西来存储多个条形图,所以我正在尝试做这样的事情:
Element allBars [] = new Element("Bars");
我很确定这不是我想要做的,特别是因为我收到此错误“聚合对象需要使用 '...' 进行初始化”
这是我的一段代码:
if(!chartDataString.empty())
chartData.clear();
int index = 0;
char c, c1, c2;
inputMode currentInputMode = inputMode::UNKNOWN;
Element * cur = NULL;
while(index<chartDataString.size())
c = chartDataString[index];
c1 = chartDataString[index+1];
c2 = chartDataString[index+2];
string s;
s = c1;
Element * currentBar = new Element("Bar");
Element allBars [] = new Element("Bars");
if(c == '*')
if(c1 == 'i')
currentBar->addChild(Element("rehearsalLetter", "info"));
else
currentBar->addChild(Element("leftDoubleBarLine", s));
index++;
else if(c == '[')
currentBar->addChild(Element("leftDoubleBarLine"));
else if(c == 'T')
string signature = string() + c1 + '/' + c2;
currentBar->addChild(Element("timeSignature", signature));
index += 2;
//start a new bar
else if(c == '|')
allBars->addChild(currentBar);
currentBar = new Element("bar");
还有我的元素类,以防万一:
#include <string>
#include <ostream>
#include "ArrayList.h"
class Element
public:
Element()
Element( const string& _title )
title = _title;
Element( const string& _title, const string& _value)
title = _title;
value = _value;
;
~Element();
void addChild(Element & child)
children.add(child);
void serialize(ostream & o )
if( children.size() == 0 )
o << "<" << title << ">";
o << " " << value << " ";
o << "</" << title << ">";
else
o << "<" << title << ">" << endl;
for( int i = 0; i < children.size(); ++i )
children.elementAt(i).serialize(o);
o << "</" << title << ">" << endl;
private:
string title;
string value;
ArrayList<Element> children;
;
【问题讨论】:
试试std::vector<Element>
。动态数组是不适合语言的疣和癌症。有多个关于动态数组的缺陷报告开放。
【参考方案1】:
当你声明一个变量Element allBars []
时,编译器确实需要一个像 Element("Bar"), Element("Foo")
这样的值列表。这是一个静态数组,其大小在编译时已知。比如:
Element allBars [] = Element("Bar"), Element("Foo") ;
(请注意某些编译器确实需要在[]
中指定元素的数量)。
如果你想声明一个动态数组,要么使用std::vector<Element> allBars;
,我强烈推荐,因为它会导致增长和收缩,而无需担心内存分配和释放。你的类应该有一个默认构造函数、一个复制构造函数和一个赋值运算符(即使是由编译器生成的)。
或者你使用一个用new Element[xxx]
填充的指针,比如Element* allBars = new Element[size_of_array];
,它不能增长也不能缩小,你必须使用delete[]
显式删除才能为每个元素调用Element
析构函数你的数组。
在这两种情况下,数组的每个Element
都将使用默认构造函数进行初始化。
【讨论】:
我有一个数组列表类,可以只做一个条形的数组列表吗?(Beware some compiler do require the number of element to be specified in the []).
例如?这样的编译器会不符合标准。
因为我没有看到 ArrayList 代码,所以我不知道 :) 但是vector
很棒。就阵列的安全性和性能而言,很难被击败。唯一的问题是当你有大量的值可以连续存储时。
@Johan: 那就是你切换到std::deque
@Sarah for (auto& elem: allBars) elem.addChild(the_child);
如果适合你【参考方案2】:
您是否尝试使用单个元素初始化数组,但希望它的大小有所不同?如果是这样,请使用向量:
vector<Element*> allBars;
vector.push_back(new Element());
如果您能够使用 C++11,请考虑使用 unique_ptr 以确保没有内存泄漏,并在添加到向量时使用 emplace_back 避免复制:
vector<unique_ptr<Element>> allBars;
vector.emplace_back(unique_ptr<Element>(new Element()));
【讨论】:
我不明白为什么 unique_ptr 是一个不错的选择。您忘记了最明显的选项:std::vector<Element>
这是一个比原始指针更好的选择,这就是我要说的。我什么都没忘记。
这仍然是一个差的选择。谁在乎它是否稍微好一点?
显然不是你,但为什么你觉得有必要这么说是我无法理解的。以上是关于聚合对象应使用“...”进行初始化的主要内容,如果未能解决你的问题,请参考以下文章