所以我正在实现我自己的Quaternion类,当我从成员函数调用我的一个操作符(静态)函数时遇到了一个我没想到的问题。请参阅函数rotateByVector()
;
class Quaternion
{
public:
double x, y, z, w;
Quaternion(double w, double xi, double yj, double zk)
{
w = w;
x = xi;
y = yj;
z = zk;
}
Quaternion operator +(Quaternion q1, Quaternion q2)
{
return Quaternion(q1.w + q2.w, q1.x + q2.x, q1.y + q2.y, q1.z + q2.z);
}
Quaternion operator*(Quaternion q1, Quaternion q2)
{
return Quaternion(q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z
, q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y
, q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z
, q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x);
}
void rotateByVector(double x1, double y1, double z1, double[3] res)
{
// want to calculate Hamilton Product
// res_quaternion = this_quaternion * quaternion_vector(0, x1, y1, z1) * this_conj;
// return double[3] {res_quaternion.x, res_quaternion.y, res_quaternion.z}
Quaternion q = Quaternion(0.0f, x1, y1, z1);
Quaternion r = (*this).operator*() q; //doesn't like it
Quaternion r = this->operator*(q); //doesn't like it either
...
r = r * this.conj();
res[0] = r.x;
res[1] = r.y;
res[2] = r.z;
}
}
我应该如何实现this quaternion
乘以参数乘以this quaternion
我知道我很了解,但我肯定错过了一些东西。
答案 0 :(得分:1)
所以,当你在你的问题中重载你的运算符时,你写下这个::
Quaternion operator*(Quaternion q1, Quaternion q2)
由于这是一个成员函数,您应该将其更改为
(1) Quaternion operator*(Quaternion q2)
或者可能使用像
这样的朋友功能 (2) friend Quaternion operator*(Quaternion q1, Quaternion q2)
所以,当你想要乘以2 Quaternion
个对象并使用(1)中提到的声明时,可能就像这样::
Quaternion a, b, c;
c = a*b;
您的通话a*b
会以某种方式转变为a.operator*(b)
本身,因此您无需明确调用Quaternion r = a.operator*(b);
(就像我在您的代码中看到的那样)
在operator
功能中,您可以使用a
指针访问this
的成员,因为您在对象operator*()
上调用函数a
。
这就是运算符重载的意思!我们使用对象之间的普通运算符而不是调用函数。
使用(2)声明时,使用friend
,朋友不是成员函数,但它可以访问私有数据成员,因此当您使用声明时(2)为计算中涉及的两个对象传递了2个参数,因为这次没有在任何对象上调用该函数!
此外,您可以考虑从运算符重载函数返回对象的引用,这将帮助您实现像(a + b + c)这样的关联性。
就像将声明更改为此::
Quaternion& operator*(Quaternion q2)
或
friend Quaternion& operator*(Quaternion q1, Quaternion q2)
希望这有帮助!
尝试查看:: Operator overloading (它详细解释了一切!)