Przeciążenie operatora przy operacjach na wektorach
Ostatnio zmodyfikowano 2017-03-31 08:59
andrzejek97 Temat założony przez niniejszego użytkownika |
» 2017-03-30 23:05:37 Czyli tak? CVector & operator =( const CVector & param ) { delete[] tablica; tablica = new float[ rozmiar ]; if( this == & param ) throw "blad"; for( int i = 0; i < rozmiar; i++ ) { tablica[ i ] = param.tablica[ i ]; } }
|
|
karambaHZP |
» 2017-03-31 00:31:05 if( this == & param ) throw "blad"; |
Po co rzucać wyjątkami, skoro wystarczy zwrócić dany obiekt bez modyfikacji? Daj sprawdzanie jako pierwszą instrukcję w bloku. if( this == & param ) { return * this; } |
|
andrzejek97 Temat założony przez niniejszego użytkownika |
» 2017-03-31 07:13:28 Takie mam wytyczne zadania, mam sprawdzać czy w przypadku operatora = nie zostało wykonane przypisanie do samego siebie, w przypadku operacji artmetycznych czy rozmiary obiektu są takie same, w przypadku operatora [] czy nie podany został indeks z poza zakresu, mam zadbać o zwracanie odpowiednich wyjątków, więc float & operator []( int j ) { if( j >= rozmiar || j < 0 ) { throw "Zly rozmiar"; } return tablica[ j ]; } const float & operator []( int j ) const { if( j >= rozmiar && j < 0 ) { throw "Zly rozmiar"; } return tablica[ j ]; } Vector Vector::operator +( const Vector & param ) { Vector temp( rozmiar ); if( rozmiar != param.rozmiar ) throw "Niezgodne rozmiary wektorow"; for( int i = 0; i < rozmiar; i++ ) { temp.tablica[ i ] = tablica[ i ] + param.tablica[ i ]; } return temp; Wklejam też cały kod #include<iostream> using namespace std;
class Vector { int rozmiar; float * tablica; public: Vector( int size ); Vector( const Vector & param ) { tablica = new float[ param.rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tablica[ i ] = param.tablica[ i ]; } } Vector & operator =( const Vector & param ) { if( this == & param ) throw "blad"; delete[] tablica; tablica = new float[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tablica[ i ] = param.tablica[ i ]; } } Vector operator +( const Vector & ); Vector operator -( const Vector & ); Vector operator *( float d ); Vector operator /( float d ); ~Vector(); float & operator []( int j ) { if( j >= rozmiar || j < 0 ) { throw "Zly rozmiar"; } return tablica[ j ]; } const float & operator []( int j ) const { if( j >= rozmiar && j < 0 ) { throw "Zly rozmiar"; } return tablica[ j ]; } };
Vector Vector::operator +( const Vector & param ) { Vector temp( rozmiar ); if( rozmiar != param.rozmiar ) throw "Niezgodne rozmiary wektorow"; for( int i = 0; i < rozmiar; i++ ) { temp.tablica[ i ] = tablica[ i ] + param.tablica[ i ]; } return temp; } Vector Vector::operator -( const Vector & param ) { Vector temp( rozmiar ); for( int i = 0; i < rozmiar; i++ ) { temp.tablica[ i ] = tablica[ i ] - param.tablica[ i ]; } return temp; } Vector Vector::operator *( float d ) { Vector temp( rozmiar ); for( int i = 0; i < rozmiar; i++ ) { temp.tablica[ i ] = tablica[ i ] * d; } return temp; } Vector Vector::operator /( float d ) { Vector temp( rozmiar ); for( int i = 0; i < rozmiar; i++ ) { temp.tablica[ i ] = tablica[ i ] / d; } return temp; }
Vector::Vector( int size ) : rozmiar( size ) { tablica = new float[ rozmiar ]; for( int i = 0; i < rozmiar; i++ ) { tablica[ i ] = 0; } } Vector::~Vector() { delete[] tablica; }
int main() { int wielkosc; cout << "Podaj wielkosc wektora: "; cin >> wielkosc; Vector pierwszy_wektor( wielkosc ); for( int i = 0; i < wielkosc; i++ ) { pierwszy_wektor[ i ] = i + 1; cout << pierwszy_wektor[ i ] << '\n'; } Vector drugi_wektor( wielkosc ); cout << "\nWektor drugi: \n"; for( int i = 0; i < wielkosc; i++ ) { drugi_wektor[ i ] = i + 2; cout << drugi_wektor[ i ] << '\n'; } Vector result( wielkosc ); cout << "Podaj mnoznik\n"; float dd; cin >> dd; result = pierwszy_wektor * dd; cout << "Wynik mnozenia pierwszego wektora przez liczbe:\n"; for( int i = 0; i < wielkosc; i++ ) cout << "Wynik mnozenia = " << result[ i ] << '\n'; result = pierwszy_wektor + drugi_wektor; cout << "wynik dodawania dwoch wektorow\n"; for( int i = 0; i < wielkosc; i++ ) cout << "Wynik dodawania = " << result[ i ] << '\n'; return 0; }
|
|
karambaHZP |
» 2017-03-31 08:59:34 w przypadku operatora [] czy nie podany został indeks z poza zakresu |
W standardzie operator [] nie sprawdza indeksów (zadanie to należy do programisty), natomiast metoda .at() sprawdza i rzuca wyjątkiem out_of_range w przypadku wyjścia poza poprawne indeksy. przypadku operatora = nie zostało wykonane przypisanie do samego siebie |
W przypadku wykrycia takiej sytuacji, operator zwraca samego siebie. |
|
1 « 2 » |