Как написать следующий "foreach" как итераторы C ++ - PullRequest
0 голосов
/ 15 декабря 2011

Ниже приведен пример кода, взятый из приложения Qt.Я хочу написать следующий цикл "foreach" как для цикла с итераторами C ++.

DocumentWindow *MdiWindow::activeDocument()
{
  return qobject_cast<DocumentWindow*>(workspace->activeWindow());
}

int i=1;
foreach( QWidget *w, workspace->windowList() ) // workspace = new QWorkspace();
      {
        QString text;
        if( i<10 )
          text = tr("&%1 %2").arg( i++ ).arg( w->windowTitle() );
        else
          text = w->windowTitle();

        QAction *action = windowMenu->addAction( text );
        action->setCheckable( true );
        action->setChecked( w == activeDocument() );
        connect( action, SIGNAL(triggered()), mapper, SLOT(map()) ); // mapper = new QSignalMapper( this );
        mapper->setMapping( action, w );
}

Вот моя попытка.Он хорошо компилируется, но как только этот код вызывается в работающем приложении, происходит сбой.и я не знаю почему.Я правильно делаю?

DocumentWindow *MdiWindow::activeDocument()
{
  return qobject_cast<DocumentWindow*>(workspace->activeWindow());
}

int i = 1;    
for(QWidgetList::iterator it = (workspace->windowList()).begin(); it != (workspace->windowList()).end(); ++it)
{
            QString text;
            if(i < 10)
                text = QString("&%1 %2").arg(i++).arg((*it)->windowTitle());
            else
                text = (*it)->windowTitle();

            QAction *action = windowMenu->addAction(text);
            action->setCheckable(true);
            action->setChecked((*it) == activeDocument());
            connect(action, SIGNAL(triggered()), mapper, SLOT(map()));
            mapper->setMapping(action, (*it));
}

Ответ: Я не понял, что workspace-> windowList () возвращает значение, и, следовательно, оба итератора указывают на разные экземпляры контейнеров.

1 Ответ

5 голосов
/ 15 декабря 2011

Вы вызываете workspace->windowList() несколько раз в запросе, который будет возвращать разные контейнеры, и, следовательно, итератор не из одной коллекции.

Сохраните результаты workspace->windowList() в локальной переменной и выполните итерациюсверх этого.

QWigetList winList = workspace->windowList() for(QWidgetList::iterator it = winList.begin(); it != winList.end(); ++it)

Причина, по которой это происходит, заключается в том, что windowList() возвращает QWidgetList по значению, а не по ссылке.См. этот вопрос для обсуждения того, что происходит.

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