QList :: iterator只返回(错误)0

时间:2011-05-03 17:48:14

标签: c++ visual-studio-2010 qt

我正在使用QList并且我希望迭代器虽然它,但我从它获得的迭代器仍然失败,即使我使用auto关键字。

for( auto iter = myModel->getList().begin(); iter != myModel->getList().end(); ++iter )
{
    if( (*iter)->getList().empty() )
    {
        if( (*iter)->getData()->getCode() == baseData->getCode() )
            return true;
    }
}
return false;

有谁知道为什么会发生这种情况?或者我有不同的方式使用QList :: iterator?

EIDT: 我注意到了另一件奇怪的事情。我确实看到迭代器显示(错误)0,这很奇怪,因为它实际上包含了我需要的数据。

但是,如果我编辑我的代码看起来像这样:

QList<T*> tempList = myModel->getList();    
for( auto iter = tempList .begin(); iter != tempList .end(); ++iter )
        {
            if( (*iter)->getList().empty() )
            {
                if( (*iter)->getData()->getCode() == baseData->getCode() )
                    return true;
            }
        }
        return false;

然后一切正常。我想这是一个解决方案,但有谁知道为什么需要像这样做?或者我只是没有看到非常重要的东西?

2 个答案:

答案 0 :(得分:2)

我发现代码存在两个问题。

a)myModel->getList()返回QList的副本,声明如下:

QList<T*> YourModel::getList()

你实际上应该获得访问冲突。但我不知道这是不是发生了什么。

b)如果你只依赖于Visual Studio对它的评价,那就算了吧,错了。它只是无法处理迭代器。尽管迭代器将其(错误)0表示为int,但如果取消引用,它仍将为您提供正确的数据。

如果以上都不是这种情况,请说明实际出现的问题,for循环是否一起跳过?如果是这样,我会相应地编辑我的答案。

最好的问候 d

EDIT 它与临时List对象一起正常工作的原因如下: 在使用列表的begin()方法创建迭代器的那一刻,列表将分离其私有数据(隐式共享),这意味着它会创建自身的深层副本,因为您可以使用该迭代器更改数据。没有临时对象myModel->getList()创建一个临时对象,该对象在创建迭代器之后立即被破坏。从迭代器上的那一刻起,无处可去。您可以尝试使用const iterator,这个应该可以在不分离私有数据的情况下工作,因此没有问题。 另一种方法是使模型将列表作为const引用或指针返回。 另一种方法是丢弃迭代器并直接使用列表的at()方法。在我看来,使代码更具可读性。

答案 1 :(得分:1)

myModel-&gt; getList返回什么类型?

除非您有列表,否则这一行看起来很可疑:

if( (*iter)->getList().empty() )

无论如何,这些电话本身总体看起来不错。唯一真正的解释要么取决于您的类型,要么取决于数据(或缺少数据)。您发布的代码中没有明显和明显的问题。