[C++] Macierze- przeciążenie operatorów
Ostatnio zmodyfikowano 2015-04-21 20:14
wersob95 Temat założony przez niniejszego użytkownika |
[C++] Macierze- przeciążenie operatorów » 2015-04-20 20:44:25 Jako zadanie otrzymałam przeciążenie operatorów +, +=, -, -=, *, *= , ale nie mogę sobie poradzić nawet już z dodawaniem próbowałam już naprawdę na wiele sposobów, ale jako, że jestem początkująca nie za bardzo wychodzi. Na poprzednie zadanie mieliśmy utworzyć klasę macierzy, która wyświetla macierz wypełnioną zerami, jedynkami lub losowo 0 i 1. Rozwiązałam to jako switch-case żeby użytkownik mógł sam wybrać, którą opcje wybiera, dlatego już większość mam, teraz tylko te operatory i nie wiem jeszcze co z przyjaźnią czy jest ona potrzebna? #ifndef MACIERZ_H #define MACIERZ_H #include <iostream> using namespace std;
class Macierz { int m, n; int o; double ** tablica; public: Macierz( int m, int n ); Macierz( int m ); ~Macierz(); void wyswietl(); Macierz( const Macierz & a ); Macierz operator +( const Macierz & w ); Macierz & operator +=( const Macierz & w ); Macierz operator -( const Macierz & w ); Macierz & operator -=( const Macierz & w ); Macierz operator *( const Macierz & w ); Macierz & operator *=( const Macierz & w ); friend ostream & operator <<( ostream & str, const Macierz & b ); };
#endif
#include "macierz.h" #include <iostream> #include <cstdlib> #include <time.h> using namespace std;
Macierz::Macierz( int m1, int n1 ) { cin >> o; cout << endl; m = m1; n = n1; tablica = new double *[ m ]; switch( o ) { case 0: for( int i = 0; i < m; i++ ) { tablica[ i ] = new double[ n ]; for( int j = 0; j < n; j++ ) tablica[ i ][ j ] = 0; } break; case 1: for( int i = 0; i < m; i++ ) { tablica[ i ] = new double[ n ]; for( int j = 0; j < n; j++ ) tablica[ i ][ j ] = 1; } break; case 2: for( int i = 0; i < m; i++ ) { tablica[ i ] = new double[ n ]; for( int j = 0; j < n; j++ ) tablica[ i ][ j ] = rand() % 2; } break; default: cout << "wybrano niepoprawnie"; } } Macierz::Macierz( int m1 ) { m = m1; tablica = new double *[ m ]; for( int i = 0; i < m; i++ ) { tablica[ i ] = new double[ n ]; for( int j = 0; j < n; j++ ) tablica[ i ][ j ] = rand() % 2; } } void Macierz::wyswietl() { for( int i = 0; i < m; i++ ) { for( int j = 0; j < m; j++ ) cout << tablica[ i ][ j ] << "\t"; cout << endl; } } Macierz::Macierz( const Macierz & a ) : m( a.m ) , n( a.n ) { } Macierz Macierz::operator +( const Macierz & w ) { Macierz p( m, n ); for( int i = 0; i < m; i++ ) for( int j = 0; j < n; j++ ) return p; } ostream & operator <<( ostream & str, const Macierz & b ) { str << b.m; if( b.n >= 0 ) str << " "; str << b.n << " " << endl; return str; } Macierz::~Macierz() { for( int i = 0; i < m; i++ ) delete[] tablica[ i ]; delete[] tablica; }
|
|
darko202 |
» 2015-04-21 08:57:36 |
|
Monika90 |
» 2015-04-21 20:14:17 Na ogół operatory + - * / implementuje się za pomocą += -= *= /=, gdzie te pierwsze są zadeklarowane poza klasą i nie są zaprzyjaźnione, a te drugie są składowymi klasy. Potrzebny będzie prawidłowo działający konstruktor kopiujący Macierz( const Macierz & ); . Twój nie jest prawidłowy. (operator przypisania też by się przydał) W konstruktorze Macierz::Macierz( int m1 ) masz błąd - składowa n nie została zainicjalizowana. I tak jak Ci pisze darko202, sprawdzaj czy wymiary operandów się zgadzają. Jak się nie zgadzają można rzucić wyjątek. |
|
« 1 » |