2013-03-11 44 views
0

我写了一个小3d矢量类。特别是我写了两个函数,一个用于旋转矢量,另一个用于返回矢量本身的旋转副本。所以我有followig:编译器如何选择正确的函数?

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

我得到错误: 没有运营商“=”这些操作数 操作数类型匹配:矢量= void

我希望编译器能够理解我想要的:为什么他选择void版本而不是另一个返回向量?而且,以我的方式编写更多版本的相同函数是否是一种很好的做法?

+1

好的做法? **没有**。语义真的很混乱。明确该功能的功能。 – 2013-03-11 17:02:39

回答

1

返回类型不参与重载解析。换句话说,你不能有只在返回类型上有所不同的函数。

我认为你的代码只能编译,因为其中的一个函数是“const”。

+0

我知道。但是const有所作为,这就是代码编译的原因。 – MarcDuQuesne 2013-03-11 17:02:27

+0

你可以重载常量。 – Puppy 2013-03-11 17:02:51

+0

编译器没有问题,重载是合法的,因为其中一个是'const'方法,另一个不是。 – juanchopanza 2013-03-11 17:04:17

1

如果向量1不是常量,它会选择

void Vector::Rotate(const double angle, Vector & axis) 

成员函数,就是有一个隐伏参数,

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) 

你的对象向量1的指针vector *

我猜编译会选择最好的匹配一个

+0

看到大卫的回答评论:为什么这样?我认为将方法声明为const只是防止它意外修改类的成员变量。那么,为什么这个调用取决于对象呢? – MarcDuQuesne 2013-03-11 17:20:21

+0

我已经改变了我的答案,希望能解释一下 – camino 2013-03-11 17:30:47

6

编译器仅根据调用成员函数的对象选择const或非const过载。如果对象(或参考)是const它将选择const过载。

是不是很好的做法?不。从事实上看,很明显,你对编译器应该做什么感到困惑。通常写好的代码可以很容易阅读和理解,不会混淆:)

+0

为什么会这样呢?我认为将方法声明为const只是防止它意外修改类的成员变量。那么,为什么这个调用取决于对象呢? – MarcDuQuesne 2013-03-11 17:10:54

+1

在方法上“const”有一点双重含义。告诉编译器该对象不会改变。 2.如果没有“const”的情况下有超载,告诉编译器调用哪个函数。我也觉得这很混乱。如果有人知道它为什么是这样,我会感兴趣。 :) – Sarien 2013-03-11 17:16:06

+0

@MarcDuQuesne:这就是如何处理重载决议的规则,它和其他上下文完全一样:void f(int&); void f(const int&); int i; f(i);'会调用非const的版本。给定替代方案,非常量版本优先于常量版本。 – 2013-03-11 17:19:25