Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z przekazaniem wyniku z operatora+ do macierzy

Ostatnio zmodyfikowano 2014-01-18 15:27
Autor Wiadomość
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
C/C++
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++ )
        {
            //cout << (*this).mx[i][j] << endl;
            //cout << tmp.mx[i][j] << endl;
            ( * plus ).mx[ i ][ j ] =( * this ).mx[ i ][ j ] + tmp.mx[ i ][ j ];
            cout << tem.mx[ i ][ j ] << endl;
        }
    }
    return tem;
}
to main:
C/C++
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; //tak próbowałem
//D=A1.operator+(B1); //i tak
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.
P-102422
Monika90
» 2014-01-18 12:12:12
Czy konstruktor kopiujący i operator przypisania są poprawne?
P-102426
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.
C/C++
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.

C/C++
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;
}
P-102433
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ą.
P-102441
GarryMoveOut
Temat założony przez niniejszego użytkownika
» 2014-01-18 15:27:19
C/C++
matrix & operator +( const matrix & one, const matrix & two )
{
    matrix three( 3, 3 );
    //matrix * plus = &three;
    for( int i = 0; i < 3; i++ )
    {
        for( int j = 0; j < 3; j++ )
        {
            //cout << (*this).mx[i][j] << endl;
            //cout << tmp.mx[i][j] << endl;
            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 ?
C/C++
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++ )
            {
                //cout << (*this).mx[i][j] << endl;
                //cout << tmp.mx[i][j] << endl;
                ( * plus ).mx[ i ][ j ] =( * this ).mx[ i ][ j ] + tmp.mx[ i ][ j ];
                //cout << tem.mx[ i ][ j ] << endl;
            }
        }
        return tem;
    }
}

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++ )
        {
            ( * this ).mx[ i ][ j ] = tmp.mx[ i ][ j ];
        }
    }
    return * this;
}
P-102447
« 1 »
  Strona 1 z 1