2012-07-28 145 views
2

我正在爲我的遊戲物理引擎編寫一個vec3類。*操作符重載操作數順序

我已經做了一個操作符重載,讓我由一個標量乘以一個向量(縮放矢量):

const vec3 operator*(const real n) const 
{ 
    return vec3(
     m_x * n, 
     m_y * n, 
     m_z * n 
    ); 
} 

這正常工作,如果在我的計算中使用正確的順序:

float rImpulse; 
vec3 vContactNormal; 
... 
vec3 vImpulse = vContactNormal * rImpulse; 
如果我改變乘法(例如,如果我把標率先在計算)的順序

,那麼編譯器不喜歡這一點,並強調了它作爲一個錯誤。

我可以更新我的vec3類,以便乘法順序無關緊要嗎?怎麼樣? (我可能會拍我的額頭時,我一看便知!)

更新

我從VEC3類中刪除我原來的運算符重載,放在VEC3類的外部以下兩個運算符重載:

const vec3 operator*(const vec3 & v, const real r) 
{ 
    return vec3( 
     v.x() * r, 
     v.y() * r, 
     v.z() * r 
    ); 
} 
const vec3 operator*(const real n, const vec3 & v) 
{ 
    return v * n; 
} 

回答

5

你需要聲明一個免費的運營商,在類外(或內,作爲friend):

const vec3 operator*(const real n, vec3 v) 
{ 
    //no need to re-implement, since you already have v * n defined 
    return v * n; 
} 

原因是,當聲明爲類成員時,第一個運算符隱含地爲this,所以您基本上已定義了vec3 * real

+0

如果運算符在類之外,final const關鍵字有什麼作用? – fishfood 2012-07-28 21:22:15

+0

@lapin ooops,複製粘貼錯誤。編輯。 – 2012-07-28 21:22:46

+0

:)沒問題!感謝您的答覆。我會在所需的13分鐘左右後接受你的答案。 – fishfood 2012-07-28 21:23:20