代码之家  ›  专栏  ›  技术社区  ›  kal

为什么贴图大小返回0

c++
  •  0
  • kal  · 技术社区  · 15 年前
      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,以及需要做什么来修复,您有什么想法吗

    5 回复  |  直到 15 年前
        1
  •  15
  •   Laurence Gonsalves    15 年前

    你的 getA 方法正在返回一个临时 复制 a ,那么你打电话给 setMap 正在修改副本,而不是原件。解决这个问题的一个方法是 格塔 A.

        2
  •  0
  •   Matt    15 年前

    返回的是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
  •   R Samuel Klatchko    15 年前

    将getA()的签名更改为:

    A &getA();
    
        4
  •  0
  •   Justin Voskuhl    15 年前

    您的方法getA当前返回成员的副本,而不是引用。相反,您希望返回A&来自格塔。这将允许您返回对成员变量的引用,而不是其副本。

        5
  •  0
  •   Loki Astari    15 年前

    每次调用getA()都会创建并返回一个新的临时对象。

    因此,第一个电话:

    b.getA().setMap(mm);
    

    创建一个对象,并在其中添加mm。

    这一行:

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

    使用对象自身的空贴图创建一个全新的对象。

    我想你想做的是:

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