Захват "this" в лямбде и сохранение его внутри std :: function создает новый объект - PullRequest
0 голосов
/ 18 октября 2019

Это расширение к этому вопросу.

У меня есть карта, которая хранит векторы обратных вызовов и связывает их с типом события. Обратный вызов выглядит так:

typedef std::function< void(sf::Event const&) > Callback;

InputHandler::registerEvent() просто берет тип события и Обратный вызов и сохраняет его внутри карты. Когда я хочу использовать его в классе Button:

cpp:

//inside the Button Constructor
inputhandler.registerEvent(sf::Event::MouseButtonPressed, Callback([this](sf::Event const& event)
        {
            //memberFunc();
        }));

Это не дало мне ошибки, но вел себя неправильно. Он действительно выполнял лямбду, но не изменял класс, в котором он был определен. Поэтому я добавил строку в конструктор, которая просто печатает адрес только что созданного объекта. Я создаю только одну кнопку, поэтому должен быть напечатан только один адрес. Но есть два разных адреса для печати. Это означает, что при вставке лямбда-выражения, обернутого в std :: function, в вектор создается новый объект Button. Как это может быть? Неявное создание объекта?

1 Ответ

0 голосов
/ 19 октября 2019

@ Ганс Да, ты прав. Оказывается, я какое-то время создал два главных меню, не замечая этого. И это привело к странному поведению, проявляющемуся в других классах, поэтому я подумал, что они вызвали это. Затруднительный. Спасибо, хотя:)

...