0

小さな 3d ベクター クラスを作成しました。特に、2 つの関数を作成しました。1 つはベクトルを回転するためのもので、もう 1 つはベクトル自体の回転されたコピーを返すためのものです。だから私は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);

次のエラーが表示されます。これらのオペランドに一致する演算子 "=" はありません。オペランドの種類は次のとおりです。Vector = void

私はコンパイラが私が何を望んでいるかを理解することを期待しています.なぜ彼はベクトルを返す他のバージョンではなく void バージョンを選択するのですか? さらに、私が行った方法で同じ関数のより多くのバージョンを書くことは良い習慣ですか?

4

3 に答える 3

6

コンパイラは、メンバー関数が呼び出されるオブジェクトのみに応じて、constまたは非オーバーロードを選択します。constオブジェクト (または参照) がconstである場合、オーバーロードが選択されconstます。

それは良い習慣ですか?いいえ。コンパイラが何をすべきかについて混乱したという事実から明らかなようです。通常、読みやすく、混乱なく解釈できるコードを書くことをお勧めします:)

于 2013-03-11T17:05:12.363 に答える
1

戻り値の型は、オーバーロードの解決には関与しません。つまり、戻り値の型だけが異なる関数を持つことはできません。

これらの関数の1つが「const」であるため、コードのみがコンパイルされると思います。

于 2013-03-11T17:01:25.927 に答える
1

vector1 が const でない場合、選択します

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

メンバー関数の場合、hiden パラメータ this があり、

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 *

コンパイルが最適なものを選択すると思います

于 2013-03-11T17:03:12.180 に答える