Maison  >  Questions et réponses  >  le corps du texte

C++ peut utiliser (référence) pour obtenir l'adresse de la valeur dans le conteneur STL mais ne peut pas modifier sa valeur.

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.

習慣沉默習慣沉默2688 Il y a quelques jours664

répondre à tous(3)je répondrai

  • 仅有的幸福

    仅有的幸福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.

    répondre
    0
  • 某草草

    某草草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.

    répondre
    0
  • PHP中文网

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

    Changez getTestData en setTestData et utilisez les données pour lui attribuer une valeur ->seconde

    répondre
    0
  • Annulerrépondre