Изменение через вектор ссылок

Рейтинг: 0Ответов: 1Опубликовано: 02.04.2023

Недавно писал код для игры на SFML, и возникла неожиданная проблема. Мне необходимо было выполнять определённую функцию элемента класса через вектор ссылок. В теории, должны были изменяться некоторые переменные, чего на практике не происходило (смешно, что в этот момент другие изменялись). Код с такой-же проблемой:

#include <iostream>
#include <vector>

using std::string;

string c = "none";

class Object
{
public:
    short x;
    short y;
    void update()
    {
        std::cout << "X:" << x << " ; " << "Y:" << y << std::endl;
    }
};

class Cube : public Object
{
private:
    unsigned short s = 5;
    bool t;
public:
    Cube(short _x, short _y)
    {
        x = _x;
        y = _y;
    }

    void edit()
    {
        if (t)
        {
            x = x + s;
            y = y + s;
        }
    }

    void update()
    {
        if (c == "edit") t = true;
        else t = false;
        Object::update();
    }
};

int main()
{
    std::vector<std::reference_wrapper<Cube>> cubes;

    Cube cube(0,0);
    cubes.push_back(cube);

    while (c != "end")
    {
        std::cin >> c;
        for (Cube i : cubes) { i.update(); }
    }
    return 0;
}

Извиняюсь за громоздкость кода, она была необходима в оригинальном коде для удобства использования.

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

P.S. Наверное лучший способ помощи - скопировать код и запустить у себя. Для простого вывода x и y напишите что-либо кроме "edit", для изменения напишите это слово.

после edit x и y не изменяются

Спасибо.

Ответы

▲ 3Принят

Простите уж, но так и вспомнился старый анекдот, как мужик у Бога просил выигрыш в лотерею, и так его этим донимал, что разверзлись небеса и голос оттуда произнес "Да купи же ты хоть один билет!"

Да вызовите же хоть раз функцию edit()!

Ну и, понятно, работать надо со ссылкой, а не копией:

void update()
{
    if (c == "edit") t = true;
    else t = false;
    edit();
    Object::update();
}

....

for (Cube& i : cubes) { i.update(); }