*运算符重载中的操作数顺序

fis*_*ood 5 c++ operator-overloading

我正在为我的游戏物理引擎编写一个vec3类.

我做了一个运算符重载,允许我将一个向量乘以一个标量(以缩放向量):

const vec3 operator*( const real n ) const
{
    return vec3(
        m_x * n,
        m_y * n,
        m_z * n
    );
}
Run Code Online (Sandbox Code Playgroud)

如果我在计算中使用正确的顺序,这可以正常工作:

float rImpulse;
vec3 vContactNormal;
...
vec3 vImpulse = vContactNormal * rImpulse;
Run Code Online (Sandbox Code Playgroud)

如果我改变乘法的顺序(例如,如果我将标量放在计算中的第一位),那么编译器不喜欢这个并将其突出显示为错误.

我可以更新我的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;
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 8

你需要声明一个自由的运算符,在类之外(或在内部,作为a friend):

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

原因是,当声明为类成员时,第一个运算符是隐式的this,因此您基本上已经定义了vec3 * real.