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

63
6

Я запутался в каждом цикле в C++. У меня этот код в главном игровом цикле:

for each (Bubble b in bubbles){
b.Update();
}
for each (Bubble b in bubbles){
b.Draw();
}

Он ничего не обновляет, но делает 1 пузырь.. Что с ним не так?

EDIT: этот код работает

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);
}

спросил(а) 2021-01-27T17:53:07+03:00 4 месяца, 4 недели назад
1
Решение
88

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

ответил(а) 2021-01-27T17:53:07+03:00 4 месяца, 4 недели назад
77

Измените свой класс 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();
});

ответил(а) 2021-01-27T17:53:07+03:00 4 месяца, 4 недели назад
63

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();
}

ответил(а) 2021-01-27T17:53:07+03:00 4 месяца, 4 недели назад
63

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

for(type identifier : expression)

то есть,

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

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

ответил(а) 2021-01-27T17:53:07+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема