所以这是一个例子。该星标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);
}
}
答案 0 :(得分:9)
std::list<Star>::const_iterator iStar;
您无法通过const_iterator
修改容器中的对象。如果要修改对象,则需要使用iterator
(即std::list<Star>::iterator
)。
答案 1 :(得分:3)
正如James告诉你的那样,你应该使用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);
}
}
尽管如此,如果您想改进代码,您可能更愿意使用getter来访问位置和速度:
void UniverseManager::ApplySpeedVector()
{
std::list <Star>::iterator iStar;
for (iStar = mStars.begin(); iStar != mStars.end(); ++iStar)
{
iStar->SetLocationData(iStar->GetLocationData() + iStar->GetSpeed());
}
}
在任何情况下,您都必须使用非const迭代器。