C++ 在qt c+中通过引用传递类的实例不起作用+;lambda信号&;槽

C++ 在qt c+中通过引用传递类的实例不起作用+;lambda信号&;槽,c++,qt,lambda,C++,Qt,Lambda,Profile3.cpp中的这段代码我只想传递Kitchen_数据类引用的实例kitchenData,不是按值传递,而是打印它 错误:未定义对的引用 `Profile3::Kitchen_双击(Kitchen_数据&)' 在profile3.h中,我已经完成了课程 class Kitchen_Data{ public: QString MealCode; QString MealName; QString MealPrice; QString MealType

Profile3.cpp中的这段代码我只想传递Kitchen_数据类引用的实例kitchenData,不是按值传递,而是打印它

错误:未定义对的引用 `Profile3::Kitchen_双击(Kitchen_数据&)'

在profile3.h中,我已经完成了课程

class Kitchen_Data{

public:

    QString MealCode;
    QString MealName;
    QString MealPrice;
    QString MealType;
    QTreeWidgetItem * itemm_CancelButton_From_Kitchen ;
    QVector <QString> KitechenItemPrice;
    QVector <QString> KitechenItemName;

    QString All_Added_ItemOfKitechen;
    QString KitchenTotalPrice;
};

如注释中所述,在lambda中传递对局部变量的引用是个坏主意。当您从
Kitchen\u双击
插槽访问实例时,实例
kitchenData
将已超出范围/被销毁。要使其能够被插槽使用足够长的时间,您需要动态分配它(例如,
Kitchen\u Data*kitchenData=new Kitchen\u Data;
),或者使
kitchenData
成为
Profile3
类的成员,例如:

class Profile3 {
    Kitchen_Data kitchenData;
    // other members, methods, slots, etc...
};

还要注意,通过引用将一个局部作用域变量
kitchenData
传递给lambda。这将导致未定义的行为。@MuhammetAliAsan@G.M.是的,至少在我在cpp文件
connect(ui->treeWidget_Kitchen,&QTreeWidget::itemDoubleClicked,[&,this](QTreeWidgetItem*item){Kitchen_DoubleClicked(item,Kitchen);}中声明函数后,它才起作用但在我使用该实例时,在函数中,软件Craches
void Profile3::Kitchen\u双击(QTreeWidgetItem*item,Kitchen\u Data&Kitchen){itemList\u Kitchen=ui->treeWidget\u Kitchen->selectedItems();foreach(item,itemList\u Kitchen){.MealCode=item->->文本(0);
当然有more@G.M.@MuhammetAliAsan i编辑作用域的lambda代码,因为`连接(ui->treeWidget_Kitchen,&QTreeWidget::itemDoubleClicked,[&,this](QTreeWidgetItem*item){Kitchen_DoubleClicked(item,Kitchen_Data Kitchen);})`我这样做并打印了一个错误
Kitchen\u数据没有引用值
,但是我在Profile3.h中有类,因此如何将实例传递给函数而不出现此时间错误..感谢您的事先指示我在'class Kitchen\u Data&'[-fpermissive]中得到了此错误`uninitialized reference member'`这是代码
class Profile3:public QWidget{Q_OBJECT public:explicit Profile3(QWidget*parent=nullptr);Kitchen_Data&Kitchen;//其他东西私有槽:void Kitchen_双击(qtreewigetitem*item,Kitchen_Data&Kitchen);}
所以我改为使构造函数中的参数也出现错误,
类Profile3:publicqwidget{Q_对象public:explicit Profile3(QWidget*parent=nullptr,Kitchen_Data&Kitchen);}
Profile3::Profile3(QWidget*parent,Kitchen_Data&Kitchen):QWidget(parent),ui(newui::Profile3){connect(ui->treeWidget_Kitchen,&QTreeWidget::itemDoubleClicked,[&,this](QTreeWidgetItem*item){Kitchen_DoubleClicked(item,Kitchen);}
我无法通过指针初始化实例的问题是,有一个价格应该更新并保留价格的过去值,例如添加一个项目,提高价格并删除它,这扣除了该项目的价格,我还有另外4个树边,传递将适用于所有项目,因此我必须使用它,感谢AdvanceDon'不要声明
Kitchen
作为参考;像我在示例代码中那样声明它。我不太确定你的程序应该如何工作,但是如果你在添加新项目时增加了总价,那么你不能在删除项目时降低价格吗?只需存储每个项目的价格,这样你就知道要扣除多少当您删除它时。当您使用该语法时(使用“&”)您声明“代码>厨房< /Cord>是对代码> KijyNoDATA < /Calp>实例的引用。引用就像其他变量的别名,类似于指针。C++中的规则是,必须在定义的点初始化引用。e引用-必须有一个已实例化的引用。这就是代码未能编译的原因;您没有在类构造函数中初始化
Kitchen
。但是,引用并不是您设计所需要的。
private slots:


void  Kitchen_DoubleClicked(Kitchen_Data &Kitchen);
class Profile3 {
    Kitchen_Data kitchenData;
    // other members, methods, slots, etc...
};