好的,我现在正在尝试实现一个简单的二维矩阵类。这是到目前为止的样子:
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
另一个有趣的事情是,如果我给出5i
和j
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 << "\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] 之后崩溃了。