7

ゲーム物理エンジン用の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クラスから削除し、次の2つの演算子オーバーロードを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;
}
4

1 に答える 1

11

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

于 2012-07-28T21:19:36.903 に答える