Хорошо, я реализую класс динамической 2-мерной матрицы. Для начала вот что я имею:
template <typename Type>
class dyMatrix {
private:
Type *mat;
int lines, columns;
int length;
void assimilate (const dyMatrix<Type>& that) {
lines = that.lines;
columns = that.columns;
length = that.length;
}
public:
dyMatrix (int height, int width)
: lines(height), columns(width), mat(0)
{
length = lines * columns;
mat = new Type[length];
};
// ---
int getLines() {
return lines;
};
int getColumns() {
return columns;
};
int getLength() {
return length;
}
// ---
Type& operator() (int i, int j) {
return mat[j * columns + i];
};
Type& operator() (int i) {
return mat[i];
};
// ---
dyMatrix (const dyMatrix<Type>& that) {
this->assimilate(that);
// ---
mat = new Type[length];
for (int i = 0; i < length; i++) {
mat[i] = that.mat[i];
}
};
dyMatrix& operator= (const dyMatrix<Type>& that) {
Type *local_mat = new Type[that.length];
for (int i = 0; i < that.length; i++) {
local_mat[i] = that.mat[i];
}
// ---
this->assimilate(that);
delete[] mat;
mat = local_mat;
// ----
return *this;
};
~dyMatrix() {
delete mat;
};
};
Моя проблема в том, что у меня возникли некоторые конкретные проблемы при попытке прочитать ввод в него. Например, у меня есть следующий main ():
int main() {
int lanes, cols;
cin >> lanes >> cols;
dyMatrix<int> map(lanes, cols);
/* CONTINUE READING */
cout << endl;
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
cout << map(i, j) << ' ';
}
cout << endl;
}
}
Где это закомментированный раздел, если я поставлю следующие строки кода:
int aux;
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
cin >> map(i, j);
}
}
или же:
int aux;
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
cin >> aux;
map(i, j) = aux;
}
}
или даже:
int aux;
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
cin >> aux;
map(i, j) = i + j; // !!!
}
}
…Это не сработает. Однако по какой-то причине следующее будет:
int aux;
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
// cin >> aux;
map(i, j) = i + j; // Still the same thing as before, logically
}
}
Я не понимаю. Что здесь происходит?
редактировать: Извините, забыл включить мою процедуру отладки.
Входные данные:
3 5
1 2 3 4 5
1 2 3 4 5
Первая строка имеет размеры матрицы. Вторая и третья строки — значения, записанные в нем; Однако после нажатия Enter в конце третьей строки программа вылетает.
Это даже не работает с этим входом:
3 5
1
2
3
4
5
1
2
3
4
5
Вылетает сразу после второй 5, опять же.
Ваши индексы выглядят неверно:
Type& operator() (int i, int j) {
return mat[j * columns + i];
};
Вот, i
явно столбец и j
это строка. Однако в ваших циклах аргументы появляются в обратном порядке:
for (int i = 0; i < lanes; i++) {
for (int j = 0; j < cols; j++) {
map(i, j) = ...; // row then column
}
}
Кроме того, деструктор должен использовать delete[]
и не delete
,
Других решений пока нет …