两个不是我自己的 类 的自定义赋值运算符
Custom assignment operator for two classes that aren't my own
我使用了两个库,一个是线性代数数学库,另一个是物理库。具体来说,我需要在类型 vec3 和 btVector3 之间进行转换。我以为我可以简单地做:
void operator=(btVector3& lhs, const vec3& rhs)
{
lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
}
void operator=(vec3& lhs, const btVector3 rhs)
{
lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
}
但我发现全局运算符重载只允许用于某些复合运算符,例如 +=、-= 等。显然赋值运算符必须是单参数函数作为 non-static 成员函数。首先我想知道这是为什么。我看到了其他答案,但我认为我没有看到这样做的原因。其次,我有一个额外的问题,这两个类型,vec3 和 btVector3 不是我的类型,所以我真的不想修改这些 类(如果我什至不能确定),可以吗只需在这些 类?
中的 headers 中完成
First of all I'm wondering why this is.
这是因为three/five/zero的规则。如果你想定义一个赋值运算符,你还需要一个复制构造函数和一个析构函数。由于显而易见的原因,不允许在 class 之外定义构造函数或析构函数,因此赋值运算符受到相同的限制。
I have the additional problem that these two types, vec3
and btVector3
aren't my types, so I'd really prefer not to modify these classes
你不需要这样做。在某种程度上,运算符是 "syntactic sugar",可以让您编写更少的代码,但在大多数情况下,您可以不用它们。除非您需要在需要赋值运算符的第三方上下文中使用您的运算符,否则您可以将运算符重写为独立函数以获得相同的效果 - 就像这样(std::swap
样式)
void assign(btVector3& lhs, const vec3& rhs)
{
lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
}
void assign(vec3& lhs, const btVector3& rhs)
{
lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
}
// Use like this:
assign(myVec3, myBtVec);
assign(myBtVec, myVec3);
或像这样(转换并分配样式)
btVector3 convert(const vec3& rhs)
{
btVector3 res;
res.setX(rhs.x); res.setY(rhs.y); res.setZ(rhs.z);
}
vec3 convert(const btVector3& rhs)
{
vec3 res;
res.x = rhs.x(); res.y = rhs.y(); res.z = rhs.z();
}
// Use like this:
myVec3 = convert(myBtVec);
myBtVec = convert(myVec3);
我使用了两个库,一个是线性代数数学库,另一个是物理库。具体来说,我需要在类型 vec3 和 btVector3 之间进行转换。我以为我可以简单地做:
void operator=(btVector3& lhs, const vec3& rhs)
{
lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
}
void operator=(vec3& lhs, const btVector3 rhs)
{
lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
}
但我发现全局运算符重载只允许用于某些复合运算符,例如 +=、-= 等。显然赋值运算符必须是单参数函数作为 non-static 成员函数。首先我想知道这是为什么。我看到了其他答案,但我认为我没有看到这样做的原因。其次,我有一个额外的问题,这两个类型,vec3 和 btVector3 不是我的类型,所以我真的不想修改这些 类(如果我什至不能确定),可以吗只需在这些 类?
中的 headers 中完成First of all I'm wondering why this is.
这是因为three/five/zero的规则。如果你想定义一个赋值运算符,你还需要一个复制构造函数和一个析构函数。由于显而易见的原因,不允许在 class 之外定义构造函数或析构函数,因此赋值运算符受到相同的限制。
I have the additional problem that these two types,
vec3
andbtVector3
aren't my types, so I'd really prefer not to modify these classes
你不需要这样做。在某种程度上,运算符是 "syntactic sugar",可以让您编写更少的代码,但在大多数情况下,您可以不用它们。除非您需要在需要赋值运算符的第三方上下文中使用您的运算符,否则您可以将运算符重写为独立函数以获得相同的效果 - 就像这样(std::swap
样式)
void assign(btVector3& lhs, const vec3& rhs)
{
lhs.setX(rhs.x); lhs.setY(rhs.y); lhs.setZ(rhs.z);
}
void assign(vec3& lhs, const btVector3& rhs)
{
lhs.x = rhs.x(); lhs.y = rhs.y(); lhs.z = rhs.z();
}
// Use like this:
assign(myVec3, myBtVec);
assign(myBtVec, myVec3);
或像这样(转换并分配样式)
btVector3 convert(const vec3& rhs)
{
btVector3 res;
res.setX(rhs.x); res.setY(rhs.y); res.setZ(rhs.z);
}
vec3 convert(const btVector3& rhs)
{
vec3 res;
res.x = rhs.x(); res.y = rhs.y(); res.z = rhs.z();
}
// Use like this:
myVec3 = convert(myBtVec);
myBtVec = convert(myVec3);