具有自定义类和operator ^重载的程序随机崩溃。我认为我在做一些琐碎的严重错误

时间:2019-05-23 19:20:16

标签: c++ class operator-overloading

我正在尝试编写自己的矩阵类(可能已经存在一百万个)。这对我有多种用法很有用,其中一种方法是对斐波那契数进行计数,并且需要快速(对数)求幂,总的来说,它的工作原理如下:

power(a, b) = power(a, b/2) * power(a, b/2) * power(a, b%2)

现在,我正在尝试重载operator ^来执行幂运算,而不是按位XOR。我知道我不应该,这很杂乱,但那都是为了个人娱乐。

这是所有代码:

#include <iostream>

using namespace std;

class matrix
{
public:
    int h;
    int w;
    int **m = nullptr;
    matrix(int height, int width)
    {
        h = height;
        w = width;
        m = new int*[h];
        for (int i = 0; i < h; i++)
        {
            m[i] = new int[w];
            for (int j = 0; j < w; j++)
                m[i][j] = 0;
        }
    }

    ~matrix()
    {
        for (int i = 0; i < h; i++)
            delete m[i];
        delete m;
    }

    matrix operator*(matrix b)
    {
        if (w != b.h)
            return matrix(1, 1);
        matrix res(h, b.w);
        for (int i = 0; i < h; i++)
            for (int j = 0; j < b.w; j++)
                for (int k = 0; k < w; k++)
                    res.m[i][j]+=m[i][k]*b.m[k][j];
        return res;
    }

    matrix operator^(int b)
    {
        if (w != h)
            return matrix(1, 1);

        if (b == 1)
            return *this;

        matrix p(w, w);
        if (b == 0)
        {
            for (int i = 0; i < w; i++)
                p.m[i][i]=1;
            return p;
        }

        p = (*this)^(b/2);
        return p*p*((*this)^(b%2));
    }

    void print()
    {
        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
                cout << m[i][j] << " ";
            cout << "\n";
        }
    }
};

int main()
{
    matrix fib(2, 2);
    fib.m[0][0] = 0; fib.m[0][1] = 1; fib.m[1][0] = 1; fib.m[1][1] = 1;
    int n;
    cin >> n;
    (fib^n).print();
}

程序有时运行良好,有时返回奇怪的值,有时崩溃。

除了需要帮助,我感觉自己犯了一个基本错误。我不知道还能说些什么。

谢谢。

0 个答案:

没有答案