我正在向我的包含实例添加一个按钮,如下所示:
pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
}, true);//true because it handles the "back" button
我要设置一个int
成员的enum
成员(包含pPromptDlg->addBtn("Okay", [](int &loopState) {
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr;
}, true);
值),表明它不再需要,但这很麻烦且可能危险,所以我更喜欢尝试
if (pPromptDlg)
然后我可以检查一下enum
并不管它。
我知道lambda有效地设置了一个类,就像enum
类一样,但是{{1}}需要解析包含它们定义的类,所以我猜测会有删除的副作用那个班级在lambda中的实例?
这可能还是只是懒惰?感谢。
答案 0 :(得分:3)
当然,您只需捕获pPromptDlg
即可:
pPromptDlg->addBtn("Okay", [&pPromptDlg](int &loopState) {
// ^^^^^^^^^^^ by reference, so that...
loopState = GlobalDefs::kGameRequestingBack;
delete pPromptDlg;
pPromptDlg = nullptr; // <-- ... this line does something meaningful*
}, true);
*有意义的是,我的意思是通过引用捕获将允许您将lambda的pPromptDlg
外部设置为nullptr
。但是,即使在按值捕获中,该行仍然有用,因为它将优雅地处理lambda被多次调用的情况。