我有使得在被点击执行给定功能按钮一个消息类:C++ LAMBDA捕获空字符串
// cMessage.h
#include "cButton.h"
class cMessage{
public:
std::vector<cButton*> button;
cMessage(const std::vector<std::function<void()> >& effect);
~cMessage();
void alert();};
// cMessage.cpp
cMessage::cMessage(const std::vector<std::function<void()> >& effect){
for(unsigned int i = 0; i < effect.size(); i++)
button.push_back(new cButton(effect[i], this)); }
cMessage::~cMessage(){
for(unsigned int i = 0; i < button.size(); i++)
delete button[i];}
void cMessage::alert(){
delete this;}
// cButton.h
class cMessage;
class cButton{
private:
cMessage* alert;
const std::function<void()> effect;
public:
cButton(const std::function<void()>& effect, cMessage* alert);
void onClick();}
// cButton.cpp
cButton::cButton(const std::function<void()>& effect, cMessage* alert): effect(effect), alert(alert){}
void cButton::onClick(){
if(alert) alert->alert();
if(effect) effect();}
当我通过lambda函数将出现问题,因为当我让那个lambda函数捕获一对由一个字符串和一个无符号整数组成,字符串在执行该函数时为空。将unsigned int,但是,仍然是1
// main.cpp
#include "cMessage.h"
int main(){
cMessage* message;
{const pair<const string, const unsigned int> var("test", 1);
std::function<void()> f = [var](){ std::cout << var.first << std::endl << var.second << std::endl; } };
message = new cMessage({f});}
message->button[0]->onClick();
return 0;}
多带些COUTS我发现,在C按钮的构造函数,该字符串仍然是“测试”。 使它变得更加怪异的东西是,当我直接构造一个按钮时,问题不会发生。
问题(导致它被删除的按钮做了它的消息调用之前只是)解决 它是由不确定的行为造成的,因为lambda函数在按钮已被删除后调用。这也解释了为什么直接创建按钮不会产生问题。令我感到惊讶的是,我还没有任何其他问题。感谢您的帮助
。你使用什么编译器? – Slava 2014-11-14 15:11:01
MinGW,这实际上是产生错误的最小代码 – RTCgee 2014-11-14 15:12:43
“效果”的类型是什么? – Barry 2014-11-14 15:13:22