2017-08-12 45 views
0

为什么这不起作用?Qt信号/插槽和C++ Lambda表达式

继承自QObject的类

b是Class子。

酒吧是Foo小孩。

void Class::method(Foo& b) { 
    Bar* bar = b.getBar(); 
    QObject::connect(bar, &Bar::s1, [&]{ 
     auto x = bar->x(); // this line throw an exception read access violation. 
    }); 
} 

作为第一次猜测,我认为当插槽被调用时,酒吧不再存在。纠正它我需要通过价值来捕获。

我知道了吗?

改变了使其工作:

void Class::method(Foo& b) { 
    Bar* bar = b.getBar(); 
    QObject::connect(bar, &Bar::s1, [bar]{ 
     auto x = bar->x(); // this line throw no more exceptions and work as expected. 
    }); 
} 
+0

什么是'Foo :: getBar'? – LogicStuff

+0

它创建一个Bar *并将其父项设置为Foo。 –

+0

可能是因为在调用信号时'bar'不再有效。 – Jepessen

回答

2

bar是本地的指针变量。 当您通过引用捕获时,它与捕获[&bar]相同,其类型为Bar**。之后,您尝试访问bar中的lambda,假设指向Bar的指针位于捕获的&bar地址。而且这是不正确的,因为局部变量被破坏了。 Bar类型的实际对象仍位于同一地址,但在通过[&]进行捕获时该地址已损坏。所以将捕获改为[bar]是正确的,因此直接捕获指针,而不是可以找到该指针的地址。

+0

谢谢你的明确解释,这就是我所设想的。 –