开发者

Why does the map size returns 0

  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 {

  开发者_StackOverflow社区    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;
  }

Output: Size 0

Any ideas as to why does this return the map size to be 0 and what needs to be done to be fixed


Your getA method is returning a temporary copy of a, so your call to setMap is modifying that copy, not the original. One way to fix this would be to have getA return a reference or pointer to a


You're returning a copy of an A, not the A object you're modifying. Try out this code to understand the difference:

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;
}


B::getA() is returning an object by value. Si when you call A::setMap() you are setting the map of the temporary object.

Change the signature of getA() to:

A &getA();


Your method getA currently returns a copy, instead of a reference to, the a member. Instead, you want to return A& from getA. This will allow you to return a reference to your member variable instead of a copy of it.


Each call to getA() is creating and returning a new temporary object.

So the first call:

b.getA().setMap(mm);

Creates an A object adds mm into it.
This then goes out of scope and destroys the map.

This line:

cout << "Size " << b.getA().getMap().size() << std::endl;

Creates a completely new A object with its own empty map.
As it is a new object the size of the map is zero.
Once this goes out of scope it is again destroyed.

I think what you meant to do is:

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;  
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜