2009-11-05 148 views
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 { 

     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,需要做的是固定的

+0

您是否在將mm分配給A中包含的尺寸之前嘗試寫入尺寸? – Jack 2009-11-05 23:41:54

+0

除了'getA'返回一個引用外,爲了提高效率,setMap的參數應該通過引用傳遞:'void setMap(const map &m)'。否則,setMap將獲得一個臨時參數副本。 – outis 2009-11-06 00:00:30

回答

14

你的getA方法正在返回副本a,因此您撥打setMap正在修改該副本,而不是原始副本。解決這個問題的一種方法是讓getA返回一個引用或指針a

0

每次調用getA()都會創建並返回一個新的臨時對象。

因此,第一個呼叫:

b.getA().setMap(mm); 

創建A對象添加毫米到它。
然後這超出了範圍並破壞了地圖。

這條線:

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

你返回一個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; 
} 
0

B :: getA()正在返回一個值的對象。當你調用A :: setMap()時,你正在設置臨時對象的映射。

變化木屐(簽名)到:

A &getA(); 
0

你的方法木屐返回當前的而不是,該成員的引用的副本。相反,您想要從getA返回A &。這將允許您返回對您的成員變量的引用,而不是其副本。

相關問題