通过地图中的引用更新对象

时间:2019-04-15 13:37:28

标签: c++ dictionary

我有一个简单的函数,它接受对象列表作为参数并调用对象方法之一来更新每个对象的属性:

void updateList( std::map<std::string, MyCustomObject> *myList )
{
    for each( std::pair< std::string, MyCustomObject > p in *myList )
    {
        std::string currentObjectKey = p.first;
        MyCustomObject    *currentObject     = &p.second;
        currentObject->setName( "NewName" );
    }
}

这是MyCustomObject类:

void MyCustomObject::setName(std::string newName)
{
    name = newName;
}

std::string MyCustomObject::getName()
{
    name = newName;
}

问题是,如果我执行另一个循环来读取更新的值,则将从初始化列表时获得原始值,而不是新的“ NewName”值。似乎for每个循环中的'p'变量是一个副本而不是引用,因此它实际上并没有更新。

如何更新值并通过引用而不是副本访问对象?

1 个答案:

答案 0 :(得分:2)

该行:

for each(std::pair<std::string, MyCustomObject> p : *myList)

没有任何作用,因为它复制了container的元素。将代码调整为:

for(auto& pair : *myList)
{
    std::string currentObjectKey = p.first;
    MyCustomObject* currentObject = &p.second;
    currentObject->setName("NewName");
}

最后的注释,don't按值传递字符串(例如setName)。如果要检查字符串,则最好使用普通的string const&string_view(因为您不复制任何内容)。如果要修改,请通过reference;如果可以廉价复制(例如,整数或浮点数),请按值传递