如何获取嵌套QList中元素的引用以修改原对象
解决QList中对象修改无效的问题
你的代码里,执行subject subj = subjects[i];时,QList会返回一个对象副本,后续对subj的修改只会作用在这个副本上,不会影响subjects列表里的原对象。下面是几种可行的解决方法:
方法1:使用引用直接操作原对象
把subj声明为原对象的引用,这样它就是原对象的别名,修改操作会直接作用在原对象上:
// 注意&符号,声明为引用 subject &subj = subjects[i]; study stud; subj.AddStudy(stud); // 现在修改的是subjects里的原对象
方法2:使用指针或智能指针管理对象
如果想用指针,要注意内存的正确管理,避免无效指针导致崩溃。推荐用Qt的智能指针QSharedPointer自动管理内存:
// 把顶层列表改成智能指针集合 QList<QSharedPointer<subject>> subjects; // 添加对象 auto subj = QSharedPointer<subject>::create(); study stud; subj->AddStudy(stud); subjects.append(subj); // 修改原对象 QSharedPointer<subject> subj = subjects[i]; study newStud; subj->AddStudy(newStud);
如果用原始指针,需要手动管理内存,容易出现问题,不推荐:
QList<subject*> subjects; // 添加对象 subjects.append(new subject()); // 修改前先判断指针有效性 subject* subj = subjects[i]; if (subj != nullptr) { study stud; subj->AddStudy(stud); } // 程序结束前要遍历列表delete所有对象,避免内存泄漏
方法3:直接通过列表索引操作原对象
也就是你想到的方案,跳过中间变量,直接通过subjects[i]访问并修改原对象:
study stud; subjects[i].AddStudy(stud); // 直接修改subjects里的原对象 // 或者直接修改study的属性 subjects[i].studies[0].data = 100;
内容的提问来源于stack exchange,提问作者Greg B
相关产品推荐
相关产品推荐

