2015-01-11 18 views
0

我加入一个按钮,我含实例是这样的:如何封装一个C++ lambda,它可以删除它的“包含”对象吗?

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),独自离开。 我知道lambda有效地设置了一个类,很像enum类,但enum需要解决包含它们的定义的类,所以我猜测会有删除lambda中类的实例的副作用?

这是可能或只是懒惰?谢谢。

+0

你的代码不能编译(除非'loopState'和'pPromptDlg'是全局的,这将是可怕的)。我猜这个代码应该在类方法中运行,而这两个变量是类的成员?在这种情况下,'[this]'而不是'[]'使得代码编译... – Yakk

回答

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); 

*通过有意义的,我的意思是通过引用捕获将让你的pPromptDlg外部拉姆达设置为nullptr。但是,即使在按值捕获中,该行仍然有用,因为它将优雅地处理多次调用lambda的情况。

+0

无论如何,这条线有意义。它可以防止在lambda被调用两次时发生坏事。 – Columbo

+0

@Columbo仅当通过引用捕获变量时,如代码片段中的* two *注释中所述。 –

+0

调用的重复正是我要添加此代码以避免,所以谢谢,现在。 – John

相关问题