2014-03-25 69 views
2

我有一個函數來規範Vec2D。我收到了C4172和C4239錯誤。我明白我不應該返回局部變量,但是我不明白我應該返回什麼。我應該讓它成爲一個指針嗎?
方法:C4172和C4239返回本地變量

inline Vec2D& normalize()const { 
    double l = length(); 
    if (x == 0) { 
     if (y == 0) { 
      return Vec2D(0, 0); 
     } 
     else { 
      return Vec2D(0, y/l); 
     } 
    } 
    else if (y == 0) { 
     return Vec2D(x/l, 0); 
    } 
    return Vec2D(x/l, y/l); 
} 
+1

任何理由通過引用('Vec2D&')not value('Vec2D')返回? –

+0

誰說不返回本地變量(按值)? – jalf

回答

3

它的優良返回局部變量,通過數值。你不應該做的是通過參考返回。從返回類型中刪除&

inline Vec2D normalize()const { 
    ... 
+0

等等,所以如果我放下'&',那麼將公共變量存儲爲'normalize()'會很好嗎? – Tips48

+0

@ Tips48:你必須重新說明這一點。我不知道你在問什麼。 –

+0

我將'normalize'的結果存儲爲一個全局變量。變量是否會失效或保持在範圍內? (如果這是有道理的) – Tips48

0

我可能會實現它:

inline void normalize(Vec2D* vect) const { 
    .... 

這樣的功能的用戶可以提供從堆棧中Vec2D,從堆中,甚至與基地Vect2D派生類。性能很好,因爲不涉及複製。

0

你在這裏什麼是迴歸到一個臨時對象的引用(這也是當地的)企圖 - Vec2D返回一個對象,你的功能,但你不存儲任何地方,只是恢復到基準它一旦移動到代碼中的下一條指令就會變得懸而未決。在這種情況下,效果與返回局部變量的引用類似,但瞭解其差異很重要。局部變量在退出函數時將變爲無效,臨時變量將在下一條指令中變爲無效。