4

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
    }

有没有办法解决这个问题,还是我只需要忍受它?

4

2 回答 2

6

从文档

Qt 在进入 foreach 循环时会自动获取容器的副本。

由于 foreach 创建了容器的副本,因此对变量使用非常量引用不允许您修改原始容器。

因此,我认为对于您的特定用例foreach不适合,否则您最终会得到Phrase带有附加指针的新副本,而不是返回Phrase您想要的实际原件。

于 2013-01-14T11:38:03.400 回答
1

不,如果您查看从以下扩展的代码foreach:qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/global/qglobal.h#line2371 它使用 const_iterator。是的,它确实复制了容器,但由于 Qt 中的所有容器类都是隐式共享的,所以它只是浅拷贝,而不是深拷贝。

于 2013-01-14T17:55:52.310 回答