C ++从成员函数调用重载运算符(静态)

时间:2015-07-16 16:00:14

标签: c++

所以我正在实现我自己的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

的共轭的倍数

我知道我很了解,但我肯定错过了一些东西。

1 个答案:

答案 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 (它详细解释了一切!)