Rumah  >  Soal Jawab  >  teks badan

C++ boleh menggunakan (rujukan) untuk mendapatkan alamat nilai dalam bekas STL tetapi tidak boleh mengubah nilainya.

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.

習慣沉默習慣沉默2688 hari yang lalu661

membalas semua(3)saya akan balas

  • 仅有的幸福

    仅有的幸福2017-05-16 13:30:05

    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.

    balas
    0
  • 某草草

    某草草2017-05-16 13:30:05

    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.

    balas
    0
  • PHP中文网

    PHP中文网2017-05-16 13:30:05

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

    balas
    0
  • Batalbalas