using namespace std;
class A {
public:
A() {}
~A() {}
map<int, string*>& getMap() {
return mapStr;
}
void setMap(const map<int,string*> m) {
mapStr = m;
}
private:
map <int, string*> mapStr;
};
class B {
public:
A getA() {
return a;
}
private:
A a;
};
int main(int argc, char*argv[]) {
map<int, string*> mm;
mm.insert(std::make_pair(1, new string("abc")));
mm.insert(std::make_pair(2, new string("def")));
B b;
b.getA().setMap(mm);
cout << "Size " << b.getA().getMap().size() << std::endl;
return 0;
}
输出: 大小0
关于为什么这会将地图大小返回为0以及需要修复的内容的任何想法
答案 0 :(得分:15)
您的getA
方法正在返回a
的临时副本,因此您对setMap
的调用正在修改该副本,而不是原始副本。解决此问题的一种方法是让getA
返回引用或指向a
答案 1 :(得分:0)
每次调用getA()都会创建并返回一个新的临时对象。
所以第一个电话:
b.getA().setMap(mm);
创建一个A对象将mm添加到其中 然后这超出了范围并破坏了地图。
这一行:
cout << "Size " << b.getA().getMap().size() << std::endl;
使用自己的空地图创建一个全新的A对象 因为它是一个新对象,所以地图的大小为零 一旦超出范围,它就会再次被破坏。
我认为你的意思是:
class B
{
A& getA() // Notice the & just after the A
{ // rather than return an object by value
return a; // you want to return a reference to the object inside
} // your B object.
private:
A a;
}
答案 2 :(得分:0)
您将返回A的副本,而不是您正在修改的A对象。尝试使用此代码来了解差异:
int main (int argc, char* argv[])
{
map<int, string*> mm;
mm.insert(std::make_pair(1, new string("abc")));
mm.insert(std::make_pair(2, new string("def")));
B b;
A a = b.getA();
B bb;
bb.getA().setMap(mm);
a.setMap(mm);
cout << "A Size " << a.getMap().size() << std::endl;
cout << "BA Size " << bb.getA().getMap().size() << std::endl;
}
答案 3 :(得分:0)
B :: getA()按值返回一个对象。当您调用A :: setMap()时,您正在设置临时对象的地图。
将getA()的签名更改为:
A &getA();
答案 4 :(得分:0)
您的方法getA当前返回一个副本,而不是对该成员的引用。相反,你想要返回A&amp;来自getA。这将允许您返回对您的成员变量的引用,而不是它的副本。