Maison > Questions et réponses > le corps du texte
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.
仅有的幸福2017-05-16 13:30:05
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.
某草草2017-05-16 13:30:05
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.
PHP中文网2017-05-16 13:30:05
Changez getTestData en setTestData et utilisez les données pour lui attribuer une valeur ->seconde