2012-07-28 113 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