我写了一个小的3d矢量类。特别是我写了两个函数,一个用于旋转向量,另一个用于返回向量本身的旋转副本。所以我有以下内容:
Vector Vector::Rotate(const double angle, Vector& axis) const {
Vector b=*this;
b.Rotate(angle,axis);
return (b);
}
void Vector::Rotate(const double angle, Vector & axis) {
/* let's promote this vector to a quaternion */
Quaternion V (0,*this);
/* quaternion describing the rotation */
Quaternion q (cos(angle/2),axis*sin(angle/2));
/* actual rotation */
*this = (q*V*q.conjugate()).Vec();
}
现在,当我写这样的东西时:
vector2 = vector1.Rotate(rbo::M_PUCKER,i);
我收到错误: 没有运算符“=”匹配这些操作数 操作数类型是:Vector = void
我希望编译器能够理解我想要的东西:他为什么选择void版本而不是另一个返回向量?此外,按照我的方式编写更多相同功能的版本是一种很好的做法吗?
答案 0 :(得分:6)
编译器仅根据调用成员函数的对象选择const
或非const
重载。如果对象(或引用)为const
,则会选择const
重载。
这是好的做法吗?不会。因为您对编译器应该做什么感到困惑,这似乎很明显。编写易于阅读和解释的代码通常是一种好的做法,而不会产生混淆:)
答案 1 :(得分:1)
返回类型不参与重载决策。换句话说,你不能只有返回类型不同的函数。
我认为你的代码只能编译,因为其中一个函数是“const”。
答案 2 :(得分:1)
如果vector1不是const,它将选择
void Vector::Rotate(const double angle, Vector & axis)
对于成员函数,有一个hiden参数,
Vector Vector::Rotate(const double angle, Vector& axis) const
//actually is
Vector Rotate(const Vector const * this,const double angle, Vector& axis) const
void Vector::Rotate(const double angle, Vector & axis)
//actually is
void Rotate(Vector const * this,const double angle, Vector& axis)
对象vector1的指针是vector *
我猜编译将选择最佳匹配