C++ boleh menggunakan (rujukan) untuk mendapatkan alamat nilai dalam bekas STL tetapi tidak boleh mengubah nilainya.
習慣沉默
習慣沉默 2017-05-16 13:28:05
0
3
706
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.

習慣沉默
習慣沉默

membalas semua(3)
仅有的幸福

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.

Ty80

Tukar getTestData kepada setTestData dan gunakan data untuk memberikan nilai padanya->second

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan