为什么地图大小返回0

时间:2009-11-05 23:35:41

标签: c++

  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以及需要修复的内容的任何想法

5 个答案:

答案 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。这将允许您返回对您的成员变量的引用,而不是它的副本。