You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:02:46