C++函数内为Qt沙龙预约项目Chair对象分配Stylist对象失效问题
解决Qt沙龙项目中Chair对象Stylist赋值外部不生效的问题
看起来你遇到的是C里非常经典的传值与传引用/指针的坑,刚接触C很容易在这里踩雷,结合你的Qt项目场景,咱们一步步来解决:
问题根源:你可能在函数里修改了Chair的副本
如果你的分配函数是类似这样写的(错误示范):
void assignStylistToChair(Chair chair, Stylist stylist) { chair.setStylist(stylist); // 这里打印的是副本的Stylist,所以显示成功 qDebug() << "Assigned stylist:" << chair.getStylist().getName(); }
当你调用assignStylistToChair(myChair, myStylist)时,chair参数是原myChair的副本,函数里修改的只是这个临时副本,函数执行完副本就销毁了,原myChair完全没被改动,所以外部调用getter自然拿不到新的Stylist。
解决方案:用引用或指针传递Chair对象
方案1:使用引用(推荐,更安全)
把函数参数改成Chair的引用,这样函数操作的就是原对象本身:
// 参数前加&表示引用 void assignStylistToChair(Chair &chair, Stylist stylist) { chair.setStylist(stylist); qDebug() << "Assigned stylist:" << chair.getStylist().getName(); }
调用的时候直接传原对象就行:
assignStylistToChair(myChair, myStylist); // 现在外部调用myChair.getStylist()就能拿到正确的值了
方案2:使用指针
如果你习惯用指针(Qt里很多场景也会用到指针),可以这样写:
void assignStylistToChair(Chair *chair, Stylist stylist) { if (chair != nullptr) { // 记得判空,避免野指针崩溃 chair->setStylist(stylist); qDebug() << "Assigned stylist:" << chair->getStylist().getName(); } }
调用时传对象的地址:
assignStylistToChair(&myChair, myStylist); // 或者如果myChair是堆上的指针(比如new出来的): // assignStylistToChair(myChairPtr, myStylist);
补充:C++引用/指针的基础要点(帮你加深理解)
- 传值:会创建参数的副本,函数内的修改只影响副本,和原对象无关。
- 传引用:相当于给原对象起了个别名,操作引用就是直接操作原对象,不需要额外的内存开销,也不用判空(只要你确保传入的是有效对象)。
- 传指针:传递的是原对象的内存地址,通过指针可以间接修改原对象,需要注意判空防止崩溃。
另外可以顺便检查下你的Chair类的setStylist方法是不是正确设置了成员变量,比如:
// Chair类的setStylist示例(假设Stylist成员是m_stylist) void Chair::setStylist(const Stylist &stylist) { m_stylist = stylist; // 直接赋值,若成员是指针则需额外处理内存 }
内容的提问来源于stack exchange,提问作者S.C20
相关产品推荐
相关产品推荐

