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

Przeciążenie operatora przy operacjach na wektorach

Ostatnio zmodyfikowano 2017-03-31 08:59
Autor Wiadomość
andrzejek97
Temat założony przez niniejszego użytkownika
» 2017-03-30 23:05:37
Czyli tak?
C/C++
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 ];
    }
}
P-159621
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; }
P-159627
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
C/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 ]; }
 
C/C++
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
C/C++
#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;
} //nie wiem w którym miejscu powinienem umieścić bloki try i catch
P-159630
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.

P-159632
1 « 2 »
Poprzednia strona Strona 2 z 2