Heim  >  Fragen und Antworten  >  Hauptteil

C++ kann (Referenz) verwenden, um die Wertadresse im STL-Container abzurufen, seinen Wert jedoch nicht ändern.

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;
}

Vielen Dank für Ihre Hilfe.

習慣沉默習慣沉默2688 Tage vor663

Antworte allen(3)Ich werde antworten

  • 仅有的幸福

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

    你对引用的理解有错啊
    getTestData(testMap, 1, tempData1);
    这条语句并不能使tempData1变成对testMap[1]的引用,这个函数只是让函数中所有对data的操作同样反映到tempDada1上,所以是data变成了tempData1的引用。而你的tempdata1根本没有引用testMap里面的任何元素,所以改变了tempdata1不会有啥效果的。

    Antwort
    0
  • 某草草

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

    在getTestData函数里面,你的赋值语句data=it-<second;会调用类的拷贝构造函数。因为你没有写,所以调用的是默认拷贝构造函数。也就是说你的这个赋值,并没有将等号右边的对象绑定给左边的对象,而是发生了拷贝。所以你对teatData1的改变,是不会改变原始对象的。

    解决办法就是重写拷贝构造函数,让他返回原始对象。还有就是可以使用指针的方式。

    Antwort
    0
  • PHP中文网

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

    把getTestData改成setTestData,用data给it->second赋值

    Antwort
    0
  • StornierenAntwort