【发布时间】:2013-01-14 11:21:09
【问题描述】:
Qt 的 foreach 函数有点问题。我有一个类 Phrase,它是 QList 的子类。在 ~Phrase 中,我删除了所有 GlossItem 指针。
在遍历 Phrase 中的 GlossItem 指针时,我想使用 Qt 的 foreach:
// phrase is a pointer to a Phrase object,
// which is a subclassed QList<GlossItem*>
foreach( GlossItem *glossItem , *phrase )
{
// use glossItem
}
由于某种原因,foreach 正在对 Phrase 执行深层复制(我知道这一点,因为它需要我实现复制构造函数)。但是如果有 Phrase 的副本——并且我不想创建每个 GlossItem 的深层副本——这意味着这些指针将被删除两次。 (或者,删除一次,然后崩溃。)所以我必须使用这个,它有效但不太漂亮。
for(int i=0; i<phrase->count(); i++ )
{
GlossItem *glossItem = phrase->at(i);
// use glossItem
}
有没有办法解决这个问题,还是我只需要忍受它?
【问题讨论】:
-
在你的第一个例子中,你使用了一个索引变量
i——它在哪里适合? -
另外,我没有看到任何证据表明
QList有一个虚拟析构函数,它允许您从中继承。 -
这不是一个好的设计:容器是用来复制的,在 dtor 中删除它的内容会破坏(使用 Q_DISABLE_COPY 来防止复制)。正如 Tony 所说,QList 没有虚拟 dtor,因此继承它不是一个好主意。设计提示:永远不要从容器继承,而是让它们成为某个包装类的成员。类短语 { QList
list() const; ... Q_DISABLE_COPY(短语) }; -
该索引变量是复制/粘贴错误,组件 10,我对其进行了编辑。感谢您的设计投入,弗兰克。当我第一次编写代码时,我怀疑继承 QList,但现在我有一个具体的理由不这样做。