今天在开发的时候,需要将一个const QVariantList转为非const,然后遍历list修改i每一个list里value为“name”的值。但是在实际操作的时候,遇到了一些问题,最后发现,是我对一些函数的结果是引用还是指针,不太熟悉。
首先讲一下怎么把const转为非const,这里我并不像对原来的const函数有修改,所以采用拷贝构造。这里我有两种构造方法,第一种就是在调用的时候就提供一个非const的调用接口,直接获取非const的函数,第二种就是先获取const然后拷贝一下。其实原理都是一样的。
QVariantList ListCopy = obj.propertyList();//这里 `obj` 是你的类的一个对象,propertyList()为对应list的调用接口
按理说到这里之后,后面的操作就应该很简单了,但是很奇怪的是,我被卡住了。当时我的代码是这样的
QVariantList nonConstList = node->unconstPropertyList();// 利用拷贝构造函数创建一个非const副本
for(auto var :nonConstList){
var.toMap().insert("name",name);
list.append(var);
SCDebug<<var.toMap().value("name");
}
结果就是,输出的结果还是之前的。
最后询问GPT发现
1、for循环中 `var` 必须是一个引用类型才能修改原列表中的元素,否则 `var` 将是列表元素的一个副本,这样对 `var` 的修改不会影响原始列表中的元素。
2、`toMap()`函数返回的通常是一个值副本,而非引用,所以,尝试在这个副本上调用 `insert()` 并不会改变原始元素的map。
这两点是我根本没有注意的,平时for循环我都会加&,但是我一直认为的原因是让程序减少一次拷贝,没有想到副本。toMap返回的是副本,我也真的一直都不知道(狗头)。
所以最后经过修改,正确代码应该是
QVariantList nonConstList = node->unconstPropertyList();// 利用拷贝构造函数创建一个非const副本
for(auto &var :nonConstList){
QVariantMap map = var.toMap();
map.insert("name",name);
list.append(map);
SCDebug<<var.toMap().value("name");
}
_allList.append(list);