Как изменить объекты с помощью итератора?используя <list> - PullRequest
2 голосов
/ 29 декабря 2011

Итак, вот пример.Звездные mLocation и mSpeed являются пользовательским типом Vector3.

Я пробовал:

Star &star = *iStar;
Star star = *iStar;

Использование iStar-> напрямую не работает с моими операторами,не уверен почему.Так каков правильный способ сделать это?

   void UniverseManager::ApplySpeedVector()
   { 
   std::list <Star>::const_iterator iStar;

       for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
       {
           // how to I get a hold on the object the iterator is pointing to so I can modify its values
                   // i tried  Star &star = *iStar;  this is illegal
                   // tried just using the iStar->mLocation += iStar->mSpeed this also fails due to the operator not accepting the values not sure why
                   // tried other things as well, so what is the proper way to do this?

           iStar->SetLocationData( iStar->mLocation += iStar->mSpeed);
       }
   }

Ответы [ 2 ]

9 голосов
/ 29 декабря 2011
std::list<Star>::const_iterator iStar;

Вы не можете изменять объекты в контейнере с помощью const_iterator.Если вы хотите изменить объекты, вам нужно использовать iterator (т. Е. std::list<Star>::iterator).

3 голосов
/ 29 декабря 2011

Как сказал вам Джеймс, вы должны использовать std::list<Star>::iterator, чтобы вы могли изменить объект, вызвав метод или получив доступ к его переменным-членам.

Это будет примерно так:

void UniverseManager::ApplySpeedVector()
{
    std::list <Star>::iterator iStar;

    for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
    {
        iStar->SetLocationData(iStar->mLocation += iStar->mSpeed);
    }
}

Тем не менее, если вы хотите улучшить свой код, вы можете предпочесть иметь геттер для доступа к местоположению и скорости:

void UniverseManager::ApplySpeedVector()
{
    std::list <Star>::iterator iStar;

    for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
    {
        iStar->SetLocationData(iStar->GetLocationData() + iStar->GetSpeed());
    }
}

В любом случае вы должны использовать неконстантный итератор.

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