C++ 用(引用) 取的出STL容器中的 值地址却无法改变其值.

浏览:37日期:2023-03-19

问题描述

class TempTest{public: int _uid;};bool getTestData(std::map<int,TempTest>& vec,short id,TempTest &data){ auto it = vec.find(id); if (it != vec.end()) {data = it->second;return true; } return false;}int main(){std::map<int, TempTest> testMap; // create data TempTest testTemp; testTemp._uid = 1054; testMap[1] = testTemp; TempTest tempData1; // 获取出其引用 getTestData(testMap, 1, tempData1);// 改变其值 tempData1._uid = 9918;// 这样是可以修改成功 可是 感觉 太沉余代码了 想封装成函数... //auto it = testMap.find(1); //if (it != testMap.end()) { // it->second._uid = 9918; //}for (auto &itor:testMap) {std::cout<<itor.second._uid<<std::endl; } // 发现其值并没有得到改变... return 0;}

谢谢大家的帮助.

问题解答

回答1:

你对引用的理解有错啊getTestData(testMap, 1, tempData1);这条语句并不能使tempData1变成对testMap[1]的引用,这个函数只是让函数中所有对data的操作同样反映到tempDada1上,所以是data变成了tempData1的引用。而你的tempdata1根本没有引用testMap里面的任何元素,所以改变了tempdata1不会有啥效果的。

回答2:

在getTestData函数里面,你的赋值语句data=it-<second;会调用类的拷贝构造函数。因为你没有写,所以调用的是默认拷贝构造函数。也就是说你的这个赋值,并没有将等号右边的对象绑定给左边的对象,而是发生了拷贝。所以你对teatData1的改变,是不会改变原始对象的。

解决办法就是重写拷贝构造函数,让他返回原始对象。还有就是可以使用指针的方式。

回答3:

把getTestData改成setTestData,用data给it->second赋值

相关文章: