m0_66977425 2023-03-28 00:37 采纳率: 100%
浏览 77
已结题

c++函数中的lambda捕获列表的问题

在c++qt中遇到一个关于lambda引用捕获的问题;下面的QtWidgetsApplication1函数是析构函数,所属的类是创建窗口的类
在我建立的这个链接中用到lambda的引用捕获,我试图对新窗口w2和按钮btn进行引用,结果会报错访问冲突;

QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent)
    : QMainWindow(parent)
{
    MyPushButton* btn = new MyPushButton(this);
    NewWidget* w2 = new NewWidget;
    btn->setText("按钮");
    connect(btn, &MyPushButton::clicked, [&]() {
        if (btn->text() == "按钮")
        {
            w2->show();
            btn->setText("消解");
        }
        else
        {
            w2->close();
            btn->setText("按钮");
        }
     });
}

但当我不用lambda建立引用,直接在该函数中建立引用新窗口和按钮进行修改时,程序正常运行,这是为什么呢

QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent)
    : QMainWindow(parent)
{
    MyPushButton* btn = new MyPushButton(this);
    NewWidget* w2 = new NewWidget;
    btn->setText("按钮");
    MyPushButton*& p = btn;
    p->setText("修改后的按钮");
}
  • 写回答

3条回答 默认 最新

  • mideum 2023-03-28 15:49
    关注

    指针就应该用=啊,如果用引用,你引用的是临时创建的btn和w2变量,而这两个变量在构造函数结束后就销毁了,所以引用的对象就没了,如果用=则是取它们的值,也就是指针地址,还是有效的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 修改了问题 3月28日
  • 创建了问题 3月28日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来