Problem z przekazaniem wyniku z operatora+ do macierzy
Ostatnio zmodyfikowano 2014-01-18 15:27
GarryMoveOut Temat założony przez niniejszego użytkownika |
Problem z przekazaniem wyniku z operatora+ do macierzy » 2014-01-18 11:30:59 Mam klasę która odpowiada za obiekty(macierze). Chcę stworzyć operator przeciążenia na razie operator+ służący do dodawania macierzy. No i w operatorze ładnie dodaje wartości bez problemów bo sprawdzałem. Jednak tak jakby nie zapisywało wyników w macierzy. to operator matrix matrix::operator +( matrix & tmp ) { matrix tem( column, row ); matrix * plus = & tem; for( int i = 0; i < row; i++ ) { for( int j = 0; j < column; j++ ) { ( * plus ).mx[ i ][ j ] =( * this ).mx[ i ][ j ] + tmp.mx[ i ][ j ]; cout << tem.mx[ i ][ j ] << endl; } } return tem; } to main: matrix A1, B1, C; A1.load_matrix( "A1.txt" ); B1.load_matrix( "B1.txt" ); C.load_matrix( "C.txt" );
matrix D( 3, 3 ); D = A1 + B1;
D.show();
Macierz D przy tworzeniu jest zerowana przez konstruktor. Pod dodaniu, gdy dochodzi do D.show() czyli próba wypisania macierzy. Wtedy zatrzymuje się na "ss_mx << mx[j] << " ";" Access violation reading location. |
|
Monika90 |
» 2014-01-18 12:12:12 Czy konstruktor kopiujący i operator przypisania są poprawne? |
|
GarryMoveOut Temat założony przez niniejszego użytkownika |
» 2014-01-18 12:56:36 Konstruktor kopiujący jest według mnie dobry. Ale zapomniałem o operatorze przypisania. matrix::matrix( matrix & ref ) { column = ref.column; row = ref.row; mx = new double *[ column ]; for( int i = 0; i < column; i++ ) { mx[ i ] = new double[ row ]; } for( int i = 0; i < row; i++ ) { for( int j = 0; j < column; j++ ) { mx[ j ][ i ] = ref.mx[ j ][ i ]; } } } Dopisałem operator przypisania. Problem z Access violation zniknął ale dalej wynik się nie zgadza. Macierz D jest pusta same 0. matrix matrix::operator =( matrix & tmp ) { matrix tem( column, row ); matrix * equal = & tem; for( int i = 0; i < row; i++ ) { for( int j = 0; j < column; j++ ) { ( * equal ).mx[ i ][ j ] = tmp.mx[ i ][ j ]; } } return tmp; }
|
|
Monika90 |
» 2014-01-18 14:07:36 Bo ten operator jest zupełnie bez sensu. Nawet sygnatura funkcji jest nie taka jak być powinna, tzn. matrix & operator =( const matrix & ) .. Ten operator powinien modyfikować obiekt na rzecz którego został wywołany, twój modyfikuje zmienną tymczasową. |
|
GarryMoveOut Temat założony przez niniejszego użytkownika |
» 2014-01-18 15:27:19 matrix & operator +( const matrix & one, const matrix & two ) { matrix three( 3, 3 ); for( int i = 0; i < 3; i++ ) { for( int j = 0; j < 3; j++ ) { three.mx[ i ][ j ] = one.mx[ i ][ j ] + two.mx[ i ][ j ]; cout << three.mx[ i ][ j ] << endl; } } return matrix( three ); } Próbowałem wzorować się na wzorze z http://cpp0x.pl/dokumentacja/standard-C++/Przeciazanie-operatorow/operator+/1512 ale coś jest nie tak nie wiem jak to rozwiązać, bo nie wiem za bardzo o co dokładnie chodzi. EDIT: Udało mi się naprawić program. Dodaje ale mam jedno pytanie. No bo ja dodaje macierze. A macierze można dodawać tylko o tych samych wymiarach, dlatego chciałbym się zapytać czy poprawne jest sprawdzanie warunków w przeciążeniach operatorów ? matrix matrix::operator +( matrix & tmp ) { if((( * this ).column ) != tmp.column &&( * this ).row != tmp.row ) { except = "Macierze sa roznych wymiarow"; throw except; } else { matrix tem( tmp.column, tmp.row ); matrix * plus = & tem; for( int i = 0; i < row; i++ ) { for( int j = 0; j < column; j++ ) { ( * plus ).mx[ i ][ j ] =( * this ).mx[ i ][ j ] + tmp.mx[ i ][ j ]; } } return tem; } }
matrix & matrix::operator =( matrix & tmp ) { for( int i = 0; i < row; i++ ) { for( int j = 0; j < column; j++ ) { ( * this ).mx[ i ][ j ] = tmp.mx[ i ][ j ]; } } return * this; }
|
|
« 1 » |