c++ - Qt 信号/槽和 C++ Lambda 表达式

标签 c++ qt lambda qt-signals qt-slot

为什么这不起作用?

类继承自QObject

b 是类(class) child 。

bar 是 Foo 的 child 。

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

最佳答案

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

关于c++ - Qt 信号/槽和 C++ Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650027/

相关文章:

c++ - 在 C++ 中解释类型为 'int' 的递归函数的返回值

python - 使用 swig 将 c++ 编译为 python

c++ - QSqlDatabase断线检测

qt - 如何设置动态创建的对象的一个​​或多个属性?

带有 Function.apply 的 Java 泛型

c++ - 为什么在 GCC 和 clang 之间编译的 c++17 lambda 有差异?

c++ - 通过外部包装程序访问exe程序中ListView的数据

c++ - 如何从Matlab调用具有多个输出的C++函数?

c++ - Qt应用程序启动崩溃

c++ - 将共享指针存储在 lambda 中以使其保持事件状态