Не могу прочитать класс функтора никоим образом

Хорошо, я реализую класс динамической 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, опять же.

2

Решение

Ваши индексы выглядят неверно:

    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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]