实现动态矩阵类的错误

Errors implementing a dynamic matrix class

本文关键字:错误 动态 实现      更新时间:2023-10-16

好了,我现在正试图实现一个简单的2D矩阵类。这是到目前为止的样子:

template <typename Type>
class dyMatrix {
    private:
        Type *mat;
        int width, height;
        int length;
    public:
        dyMatrix (int _width, int _height)
            : width(_width), height(_height), mat(0)
        {
            length = width * height;
            mat = new Type[length];
        };
        // ---
        int getWidth() {
            return width;
        };
        int getHeight() {
            return height;
        };
        int getLength() {
            return length;
        }
        // ---
        Type& operator() (int i, int j) {
            return mat[j * width + i];
        };
        Type& operator() (int i) {
            return mat[i];
        };
        // ---
        ~dyMatrix() {
            delete[] mat;
        };
};
为了测试它,并与静态多维数组进行比较,我编写了以下代码片段:
#include <iostream>
using namespace std;
/* matrix class goes here */
struct Coord {
    int x, y;
    Coord()
        : x(0), y(0)
    {};
    Coord (int _x, int _y)
        : x(_x), y(_y)
    {};
    void print() {
        cout << x << ", " << y;
    };
};
int main() {
    dyMatrix<Coord> adabo(5, 7);
    Coord inakos[5][7];
    int i = 5, j = 0;
    adabo(i, j) = *(new Coord(i, j));
    inakos[i][j] = *(new Coord(i, j));
    inakos[i][j].print();
    adabo(i, j).print();
    return 0;
}

"Adabo"answers"Inakos"是任意选择的名字。执行时,inakos打印其内容,但在adabo执行任何操作之前,程序就崩溃了。另一个有趣的事情是,如果我给ij的值不是5和0,比如分别为5和1,它工作得很好。

我不知道确切的数字是什么,也不知道是什么使程序变得混乱,我只知道这里有一个不规则的地方。我可能做错了什么?我是c++的业余爱好者,所以我可能在结构中滥用了某些东西,也可能没有。

如果有人也有时间,我很想知道我的矩阵类中是否有其他通知错误。任何可能与问题无关,但仍然是谬论的东西

我也用下面的main()测试了它,但是在inakos打印出[5][1]中的内容后,它仍然崩溃了。也许它与dyMatrix无关,而是与松散实现的Coord有关?

int main() {
    dyMatrix<Coord> adabo(5, 7);
    Coord inakos[5][7];
    for (int i = 0; i < adabo.getHeight(); i++) {
        for (int j = 0; j < adabo.getWidth(); j++) {
            adabo(i, j) = *(new Coord(i, j));
            inakos[i][j] = *(new Coord(i, j));
            inakos[i][j].print();
            cout << "; ";
        }
        cout << "nn";
    }
    cout << "nnn";
    Coord temp;
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 5; j++) {
            temp = adabo(i, j);
            temp.print();
            cout << "; ";
        }
        cout << "nn";
    }
    return 0;
}

编辑:这与Coord无关,只是用dyMatrix of int和static matrix of int进行了测试,但是在[5][0]之后崩溃了

在您的第一个示例中,您声明了inakos[5][7],因此索引范围从0到4和0到6。inakos[5][0]inakos[5][1]可能因此崩溃。

在第二个示例中,再次声明inakos[5][7],但让第一个索引从0循环到6。inakos[i][j]再次崩溃。一种解决方法是切换索引(即更改为i<adabo.getWidth()j<adabo.getHeight())。