0

好的,我现在正在尝试实现一个简单的二维矩阵类。这是到目前为止的样子:

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”和“Inakos”是任意选择的名称。执行时,打印其内容,但程序在执行任何操作inakos之前崩溃。adabo另一个有趣的事情是,如果我给出5ij0 以外的值,例如分别为 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 << "\n\n";
    }
    cout << "\n\n\n";

    Coord temp;
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 5; j++) {
            temp = adabo(i, j);

            temp.print();
            cout << "; ";
        }
        cout << "\n\n";
    }

    return 0;
}

编辑:它与坐标无关。刚刚用整数的 dyMatrix 和整数的静态矩阵进行了测试,但它在 [5][0] 之后崩溃了。

4

1 回答 1

1

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

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

于 2013-03-02T15:18:27.267 回答