QList :: iterator только возвращает (ошибка) 0 - PullRequest
1 голос
/ 03 мая 2011

Я использую 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 ]

2 голосов
/ 04 мая 2011

Я вижу две проблемы с кодом.

a) myModel->getList() возвращает копию вашего QList, объявленного примерно так:

QList<T*> YourModel::getList()

на самом деле вы должны получить нарушение прав доступа. Но я не знаю, так ли это.

б) Если вы полагаетесь только на то, что Visual Studio говорит об этом, забудьте об этом, это неправильно. Он просто не может справиться с итератором. Несмотря на то, что итератор говорит, что его (ошибка) 0 как int, он все равно даст вам правильные данные, если разыменоваться.

Если ни один из вышеперечисленных случаев не подходит, укажите, что на самом деле идет не так, пропускается ли цикл for? Если это так, я отредактирую свой ответ соответственно.

С наилучшими пожеланиями
D

EDIT Причина, по которой он отлично работает с временным объектом List, заключается в следующем: В тот момент, когда вы создаете итератор с методом begin() списка, список отсоединяет свои личные данные (неявное совместное использование), что означает, что он создает глубокую копию себя, потому что вы можете изменить данные с помощью этого итератора. Без временного объекта myModel->getList() создает временный объект, который сразу после создания итератора уничтожается. С этого момента итератор указывает на никуда. Вы можете попробовать использовать const iterator, этот должен работать без отсоединения личных данных, следовательно, без проблем. Другой подход - заставить вашу модель возвращать список в виде константной ссылки или указателя. Другой способ - отказаться от итераторов и напрямую использовать метод списка at(). На мой взгляд, делает код более читабельным.

1 голос
/ 03 мая 2011

Какой тип возвращает myModel-> getList?

Если у вас нет списка списков, эта строка выглядит подозрительно:

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

В любом случае, сами звонки в целом выглядят хорошо. Единственное реальное объяснение зависит либо от ваших типов, либо от данных (или их отсутствия). В опубликованном вами коде нет явной и очевидной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...