Dodawanie macierzy jako klas
Ostatnio zmodyfikowano 2015-03-20 20:25
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ć? #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; } |
|
Brunon3 |
» 2015-03-20 19:38:35 Kod w znaczniki [cpp] kod [/cpp].
EDIT:
Ok, poprawione. :) |
|
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. |
|
« 1 » |