Я пытаюсь написать программу cpp для выполнения матричных операций с перегрузкой оператора.Использование оператора присваивания вызывает ошибку компилятора
Мой класс Матрица имеет следующие переменные:
int m,n // order of the matrix
int **M;
Сначала у меня был конструктор и деструктор, используя новые и удалять операторов выделять и освобождать память для ** M. У меня также были функции для перегрузки операторов +, - и *. Но когда я запускаю программу, я получил значения мусора в качестве результатов. Кроме того, во время выполнения я получил ошибку (обнаружен glibc).
Похожие вопросы здесь сказали мне, что я должен добавить конструктор копирования, который «глубоко копирует» 2D-массив. Я тоже это сделал. Но та же проблема сохранялась.
Поэтому я добавил функцию для перегрузки = оператора. Теперь я получаю ошибку времени компиляции (без соответствующей функции для вызова «Matrix :: Matrix (Matrix)»), когда я использую оператор '='.
Вот мои функции:
конструктор копирования
Matrix(Matrix& other) {
m=other.m;
n=other.n;
M= new int *[m];
for(int i=0;i<m;i++)
M[i] = new int[n];
//deep copying matrix
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
M[i][j]=other.M[i][j];
}
перегружающие *:
Matrix Matrix::operator*(Matrix A) {
Matrix pro(m,A.n);
for(int i=0;i<m;i++)
for(int j=0;j<A.n;j++) {
pro.M[i][j]=0;
for(int k=0;k<n;k++)
pro.M[i][j]+=(M[i][k]*A.M[k][j]);
}
return pro;
}
перегружающие =:
Matrix Matrix::operator=(Matrix a) {
m=a.m;
n=a.n;
/*
M=new int* [m];
for(int i=0;i<m;i++) //I also tried allocating memory in this function
M[i]=new int[n];
*/
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
M[i][j]=a.M[i][j];
return *this;
}
в основной():
Matrix M1(m,n);
Matrix M2(p,q);
//inputting both matrices
Matrix M3(m,n);
Matrix M4(m,q);
M3 = M1 + M2; // Compile Time Error here...
M3.show();
M3 = M1 - M2; //...here...
M3.show();
M4 = M1*M2; //...and here.
M4.show();
времени компиляции Ошибка: нет функции соответствия для вызова «Matrix :: Matrix (Матрица)»
'Matrix (Матрица &)' Я сильно сомневаюсь, что вы хотите этого. Может быть, с 'const'? –
Вы также должны использовать 'const &' для аргументов в других функциях, чтобы избежать постоянного копирования матриц. –
'Matrix Matrix :: operator = (Matrix a) ... return * this;' не так ли? Для этого потребуется конструктор Matrix (Matrix) – user3125280