2014-01-19 4 views
0

Я пытаюсь написать программу 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 (Матрица)»

+0

'Matrix (Матрица &)' Я сильно сомневаюсь, что вы хотите этого. Может быть, с 'const'? –

+0

Вы также должны использовать 'const &' для аргументов в других функциях, чтобы избежать постоянного копирования матриц. –

+0

'Matrix Matrix :: operator = (Matrix a) ... return * this;' не так ли? Для этого потребуется конструктор Matrix (Matrix) – user3125280

ответ

1
Matrix& Matrix::operator=(const 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; 
} 

Оператор присваивания имеет неправильную подпись, так что return *this пытается вызвать конструктор типа Matrix (Matrix), которого не существует. Обязательно верните ссылку, как указано выше.

+0

За исключением случаев, когда вы используете идиому копирования и подкачки, параметр должен быть передан как 'const &'. – Manu343726

+0

@ Manu343726 извините скопируйте и вставьте задание, исправлено – user3125280

0

Помимо других ответов, говорящих об эффективном осуществлении копирования конструктора и присваивания-оператора (ваш код не является очень эффективным, но он должен работать), кажется, есть только небольшая ошибка:

Matrix(Matrix& other) { ... } кажется, вне пространства имен. Измените его на:

Matrix::Matrix(const Matrix& other) { ... }

+0

возможно, оно находится внутри определения класса, но OP не очень отзывчивый – user3125280

Смежные вопросы