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;
}
Merci pour votre aide.
Vous avez une mauvaise compréhension des références
getTestData(testMap, 1, tempData1);
Cette instruction ne fait pas de tempData1 une référence à testMap[1]. Cette fonction fait simplement en sorte que toutes les opérations sur les données dans la fonction reflètent la même chose que tempDada1. , donc data devient une référence à tempData1. Et votre tempdata1 ne fait référence à aucun élément dans testMap, donc changer tempdata1 n'aura aucun effet.
Dans la fonction getTestData, votre instruction d'affectation data=it-<second; appellera le constructeur de copie de la classe. Comme vous ne l'avez pas écrit, le constructeur de copie par défaut est appelé. En d’autres termes, votre affectation ne lie pas l’objet du côté droit du signe égal à l’objet de gauche, mais une copie se produit. Ainsi, vos modifications apportées à teaData1 ne modifieront pas l'objet d'origine.
La solution consiste à remplacer le constructeur de copie afin qu'il renvoie l'objet d'origine. Il existe également un moyen d'utiliser des pointeurs.
Changez getTestData en setTestData et utilisez les données pour lui attribuer une valeur ->seconde