通过引用 class 的构造函数传递 std::map 不更新地图
Passing std::map by reference to constructor of class not updating map
我试图理解为什么在 class 引用 std::map 的情况下,它不会更新在 [= 范围之外引用的地图=29=]。
这是我的测试程序:
#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;
};
后面是执行一些基本指令的 main :
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,这很有效,映射很好 "updated"。显然,我从构造函数中遗漏了一些东西,由于某些原因创建了一个新地图并且不再更新我在 main 函数中提供的地图。
感谢您的帮助!
您可能通过引用传递地图,但您的数据成员不是引用:
std::map<string, Foo*> f;
所以当你这样做时
this->f = f;
您复制了输入参数f
。这个简单的代码说明了问题:
void foo(int& i)
{
int j = i;
j = 42; // modifies `j`, not i`.
}
我试图理解为什么在 class 引用 std::map 的情况下,它不会更新在 [= 范围之外引用的地图=29=]。
这是我的测试程序:
#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;
};
后面是执行一些基本指令的 main :
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,这很有效,映射很好 "updated"。显然,我从构造函数中遗漏了一些东西,由于某些原因创建了一个新地图并且不再更新我在 main 函数中提供的地图。
感谢您的帮助!
您可能通过引用传递地图,但您的数据成员不是引用:
std::map<string, Foo*> f;
所以当你这样做时
this->f = f;
您复制了输入参数f
。这个简单的代码说明了问题:
void foo(int& i)
{
int j = i;
j = 42; // modifies `j`, not i`.
}