gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:22 26 4
gpt4 key购买 nike

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

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

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;
}

最佳答案

您需要在类外(或在类内,作为 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

关于c++ - * 运算符重载中的操作数顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11704729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com