C++ peut utiliser (référence) pour obtenir l'adresse de la valeur dans le conteneur STL mais ne peut pas modifier sa valeur.
習慣沉默
習慣沉默 2017-05-16 13:28:05
0
3
703
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.

習慣沉默
習慣沉默

répondre à tous(3)
仅有的幸福

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.

某草草

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.

Ty80

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal