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

Dodawanie macierzy jako klas

Ostatnio zmodyfikowano 2015-03-20 20:25
Autor Wiadomość
kam51
Temat założony przez niniejszego użytkownika
Dodawanie macierzy jako klas
» 2015-03-20 19:37:04
Witam, mam do was pytanie. Otóż kod podany niżej działa, ale zastanawia mnie jedna rzecz. Teoretycznie wg mojego prowadzącego bez napisanego przeze mnie konstruktora kopiującego coś powinno się krzaczyć, tymczasem wynik zarówno z konstruktorem kopiującym jak i bez niego jest ten sam.
Może mi ktoś wyjaśnić czy coś źle robię, czy tak ma być?
C/C++
#include <iostream>
#include <cstdio>
using namespace std;


class macierz {
private:
    int n, * wsk;
    friend istream & operator >>( istream &, macierz & );
    friend ostream & operator <<( ostream &, macierz & );
public:
    macierz() {
        wsk = 0;
        n = 0;
    }
   
   
    ~macierz() {
        if( this->wsk != 0 ) {
            delete[] this->wsk;
            wsk = NULL;
        }
    }
   
    macierz & operator =( const macierz & matrix ) {
        cout << "przyp" << endl;
        fflush( stdout );
        if( & matrix == this ) return * this;
       
        if( this->wsk != 0 ) delete[] this->wsk;
       
        n = matrix.n;
        this->wsk = new int[ n * n ];
        for( int i = 0; i < matrix.n * matrix.n; i++ )
             this->wsk[ i ] = matrix.wsk[ i ];
       
        return * this;
    }
   
    macierz operator +( const macierz & mac ) {
        macierz dodaj;
        dodaj.n = max( this->n, mac.n );
        dodaj.wsk = new int[ dodaj.n * dodaj.n ];
        for( int i = 0; i < dodaj.n * dodaj.n; i++ ) {
            if( i < min( mac.n, this->n ) * min( mac.n, this->n ) )
                 dodaj.wsk[ i ] = this->wsk[ i ] + mac.wsk[ i ];
            else
                 dodaj.wsk[ i ] = 0;
           
        }
        return dodaj;
    }
   
    macierz operator -( const macierz & mac ) {
        macierz minus;
        minus.n = max( this->n, mac.n );
        minus.wsk = new int[ minus.n * minus.n ];
        for( int i = 0; i < minus.n * minus.n; i++ ) {
            if( i < min( mac.n, this->n ) * min( mac.n, this->n ) )
                 minus.wsk[ i ] = this->wsk[ i ] - mac.wsk[ i ];
            else
                 minus.wsk[ i ] = 0;
           
        }
        return minus;
    }
};


istream & operator >>( istream & str, macierz & mat ) {
   
    str >> mat.n;
    if( mat.n > 0 ) {
        if( mat.wsk != 0 ) delete[] mat.wsk;
       
        mat.wsk = new int[ mat.n * mat.n ];
        for( int i = 0; i < mat.n * mat.n; i++ )
             str >> mat.wsk[ i ];
       
    }
   
    return str;
}

ostream & operator <<( ostream & str, macierz & mat ) {
    if( mat.wsk != 0 ) {
        for( int i = 0; i < mat.n * mat.n; i++ ) {
            str << mat.wsk[ i ] << " ";
            if(( i + 1 ) % mat.n == 0 ) str << endl;
           
        }
    }
    return str;
}




int main() {
    macierz mac, a, d;
    cout << "Podaj rozmiar macierzy a nastepnie kolejne wartosci: ";
    cin >> mac;
    cout << mac;
    d = mac;
    cout << d;
    cin >> a;
    cout << a;
    macierz b = mac + a;
    cout << "mac+a" << endl << b << endl;
    macierz c = mac - a;
    cout << "mac-a" << endl << c << endl;
    return 0;
}
P-128827
Brunon3
» 2015-03-20 19:38:35
Kod w znaczniki [cpp] kod [/cpp].

EDIT:

Ok, poprawione. :)
P-128828
Monika90
» 2015-03-20 20:25:13
Zdefiniowany przez użytkownika konstruktor kopiujący jest tutaj konieczny. Prawdopodobnie kompilator pominął wywołanie konstruktora kopiującego - jest to dozwolona optymalizacja (NRVO) i tylko dlatego program działa. Jeżeli kompilator którego używasz to GCC, to spróbuj użyć flagi -fno-elide-constructors i zobacz co się stanie.
P-128829
« 1 »
  Strona 1 z 1