我对C ++中的每个循环感到困惑。我在主游戏循环中有这个代码:
for each (Bubble b in bubbles){
b.Update();
}
for each (Bubble b in bubbles){
b.Draw();
}
它没有更新任何东西,但确实画了1个泡泡..它有什么问题?
编辑:此代码有效
struct BubbleUpdater {
void operator()(Bubble & b) { b.Update(); }
} updater;
struct BubbleDrawer {
void operator()(Bubble & b) { b.Draw(); }
} drawer;
void OnTimer(){ //this is my main game loop
std::for_each(bubbles.begin(),bubbles.end(),drawer);
std::for_each(bubbles.begin(),bubbles.end(),updater);
}
答案 0 :(得分:3)
我在C#中也有这个问题,它让我疯了一会儿。根据我的发现,for循环为集合中的每个对象创建一个新对象。所以它是通过值创建的,而不是通过引用(如果你使用标准for循环),这导致原始集合不受影响。我总是发现每个循环都适合阅读,但不能用于更新。
答案 1 :(得分:2)
更改您的BubbleUpdater类以通过引用接受它的参数
struct BubbleUpdater {
void operator()(Bubble & b) { b.Update(); }
} updater;
这样,您对std::for_each
的调用就可以了。
如果您的编译器支持它(和VC10一样),那么您可以使用lambdas而不是创建一个远程函数对象类。是的,它是标准的c ++,或者很快就会出现。
std::for_each (bubbles.begin(), bubbles.end(), [](Bubble & b){
b.Update();
});
答案 2 :(得分:1)
for each
无效c ++,如果您考虑std::for_each()
或BOOST_FOREACH
,则它们的语法不同。
std::for_each
是一个函数,具有以下接口:
std::for_each(InputIterator begin, InputIterator end, function f);
BOOST_FOREACH
是预处理器宏,具有以下接口:
BOOST_FOREACH(element e, container c)
{
do_thing(e);
e.whatever();
}
答案 3 :(得分:1)
这不是C ++,它是内存中的Qt扩展。每个循环的新C ++ 0x将具有语法
for(type identifier : expression)
即
for(auto x : std::string("ohai"))
但是,在C ++ 03中,没有专门用于每个循环语言构造。