我正在为我的游戏物理引擎编写一个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;
}
答案 0 :(得分:7)
您需要在类外(或在内部,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
。