C++ 当我尝试获取字符串时,它总是空的,lambda

C++ when i try get string, it always empty, lambda

我有对象 class

class MenuItem {
public:
    void updateInputText(string text)
    {
        this->text += text;
    }

    string getText() const {
        return this->text;
    }

    void trigger(Event event)
    {
        switch (event) {
            case ENTER:
                this->onEnterAction();
                break;
        }
    }

    function<void(void)> onEnterAction;

private:
    Text text;
    void onEnter();
};

我创建对象并设置事件处理程序

MenuItem IP;
IP.onEnterAction = eventOnEnter;
// ENTER - element from enum
IP.trigger(ENTER);

事件处理程序:

function<void(void)> eventOnEnter = [&] () {
    auto selected = next(this->currentMenu.begin(), this->selected);
    selected->updateInputText("Hello");
};

MenuItem 的第二个对象

MenuItem nextButton;
next.onEnterAction = [&] () {
    Log::write("IP: " + IP.getText());
};
// ENTER - element from enum
next.trigger(ENTER);

但是IP.getText()总是空的。我做错了什么?

在一个范围内(在一个函数中)创建的所有对象

每当我看到这样的东西时

MenuItem nextButton;
next.onEnterAction = [&] () { // Should next be nextButton???
    Log::write("IP: " + IP.getText());
};
// ENTER - element from enum
next.trigger(ENTER);

我在等待灾难的发生。如果您已经展示了一个完整的工作示例,您会注意到您的示例代码可能已经工作......那么问题是什么。

主要问题是您通过引用捕获所有内容,但从您的代码中我无法确定它是否应该工作,但我认为在大型系统中不行,原因是捕获的值已经超出范围。

std::vector<MenuItem> CreateMenu() {
  std::vector<MenuItem> res;
  function<void(void)> eventOnEnter = [&] () {
    auto selected = next(this->currentMenu.begin(), this->selected);
    selected->updateInputText("Hello");
  };
  
  MenuItem IP;
  IP.onEnterAction = eventOnEnter;
  res.push_back(IP);
  

  MenuItem nextButton;
  nextButton.onEnterAction = [&] () {
    Log::write("IP: " + IP.getText());
  };
  res.push_back(nextButton);

  return res;
}

void Call() {
  auto buttons = CreateMenu();
  // what is captured at this point???  
  buttons.back().trigger(ENTER);
}

大部分捕获的内容现已超出范围。

Surt 给了我一个提示...范围。

所有菜单项都推送到矢量,当我使用此功能时

next.onEnterAction = [&] () {
    Log::write("IP: " + IP.getText());
};

当我将函数更改为

时,我尝试从空变量中获取文本
next.onEnterAction = [&] () {
    auto selectedIP = std::next(currentMenu.begin(), 0);
    Log::write("IP: " + selectedIP.getText());
};