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;
}
Terima kasih atas bantuan anda.
Anda mempunyai pemahaman yang salah tentang rujukan
getTestData(testMap, 1, tempData1);
Pernyataan ini tidak menjadikan tempData1 menjadi rujukan kepada testMap[1]. , jadi data menjadi rujukan kepada tempData1. Dan tempdata1 anda tidak merujuk sebarang elemen dalam testMap sama sekali, jadi menukar tempdata1 tidak akan memberi kesan.
Dalam fungsi getTestData, data penyata tugasan anda=it-<second; Kerana anda tidak menulisnya, pembina salinan lalai dipanggil. Dalam erti kata lain, tugasan anda tidak mengikat objek di sebelah kanan tanda sama dengan objek di sebelah kiri, tetapi salinan berlaku. Jadi perubahan anda kepada teaData1 tidak akan mengubah objek asal.
Penyelesaian adalah untuk mengatasi pembina salinan supaya ia mengembalikan objek asal. Terdapat juga cara untuk menggunakan penunjuk.
Tukar getTestData kepada setTestData dan gunakan data untuk memberikan nilai padanya->second