for_each C ++ Проблема - PullRequest
       4

for_each C ++ Проблема

1 голос
/ 25 июня 2011

Я в замешательстве по поводу каждого цикла в 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);
}

Ответы [ 4 ]

3 голосов
/ 25 июня 2011

У меня была эта проблема и в C #, она на какое-то время сводила меня с ума.Из того, что я обнаружил, цикл for each создает новый объект для каждого объекта в вашей коллекции.Таким образом, он создает что-то по значению, а не по ссылке (если вы использовали стандартный цикл for), что приводит к тому, что исходная коллекция не выполняется.Я всегда находил для каждого цикла хорошие данные для чтения, но не для обновления.

2 голосов
/ 25 июня 2011

Измените свой класс BubbleUpdater, чтобы он принимал аргумент по ссылке

struct BubbleUpdater {
void operator()(Bubble & b) { b.Update(); }
} updater;

При этом ваш звонок на std::for_each должен работать.

Если ваш компилятор поддерживает это (а VC10 поддерживает), тогда вы можете использовать лямбда-выражения вместо создания класса объектов удаленной функции. И да, это стандартный с ++, или скоро будет достаточно.

std::for_each (bubbles.begin(), bubbles.end(), [](Bubble & b){
    b.Update();
});
1 голос
/ 25 июня 2011

Это не C ++, это расширение Qt из памяти.Новый C ++ 0x для каждого цикла будет иметь синтаксис

for(type identifier : expression)

, то есть

for(auto x : std::string("ohai"))

Однако в C ++ 03 нет выделенных для каждой языковой конструкции цикла.

1 голос
/ 25 июня 2011

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...