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());
};
我有对象 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());
};