通过引用传递std :: map到不更新map的类的构造函数

时间:2015-01-18 20:00:58

标签: c++ class reference stdmap

我试图理解为什么在一个引用了std :: map的类的情况下,它不会更新在类范围之外引用的映射。

这是我的测试计划:

#include <iostream>
#include <map>

class Foo
{
public:
    Foo(int x)
    {
        this->x = x;
    }
    void display()
    {
        cout << x << endl;
    }
protected:
    int x;
};

class FooTest
{
public:
    FooTest(std::map<string, Foo*> & f)
    {
        this->f = f;
    }
    void func()
    {
        f["try"] = new Foo(3);
    }

protected:
    std::map<string, Foo*> f;
};

其次是执行一些基本指示的主要内容:

int main()
{
    std::map<string, Foo*> f;
    f["ok"] = new Foo(1);
    FooTest test(f);
    test.func();

    for(std::map<string, Foo*>::iterator it = f.begin(); it != f.end(); ++it) {
        it->second->display();
    }
    return 0;
}

这会显示1,而我希望1然后3。 我尝试通过引用将地图传递给函数func,这很好用,地图很好地更新了#34;。显然,我错过了构造函数中的某些内容,由于某些原因,我创建了一个新的地图,并且不再更新我在主函数中提供的地图。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可能会通过引用传递地图,但您的数据成员不是引用:

std::map<string, Foo*> f;

所以当你这样做时

this->f = f;

您复制输入参数f。这个简单的代码说明了这个问题:

void foo(int& i)
{
  int j = i;
  j = 42; // modifies `j`, not i`.
}