Overloading operator + in classe Vettore

di il
4 risposte

Overloading operator + in classe Vettore

Buongiorno a tutti,

sto costruendo una classe myvec , che è sostanzialmente la solita classe vettore con l'aggiunta del calcolo della norma e dell'operator overloading, però ho difficoltà con l'overloading dell'operatore +.

Più precisamente: nella dichiarazione della classe ho scritto
myvec& operator+(const myvec& v, const myvec& w);
e nella definizione ho scritto (non ho messo nessun check sulle dimensioni per verificare la compatbilità delle operazioni perché era solo un test)

myvec& myvec::operator+(const myvec& v, const myvec& w){
        int d = v.size();	
        myvec x(d);
        for(int i=0;i<d;i++){
            x(i)=v(i)+w(i);
        }
       return x;
    }

Compilando il codice, ottengo il seguente errore:
testmyvec.cpp.cc:77:59: error: ‘myvec& myvec::operator+(const myvec&, const myvec&)’ must take either zero or one argument
che non riesco a capire sinceramente.


Per completezza, allego il codice completo con il main. Compila solamente se la definizione e la dichiarazione dell'overloading + sono commentate.

#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

class myvec{
private:
    int dimension;
    double *data;
   
public:
    myvec(int dim);
    myvec(const myvec &v);
     ~myvec();
     
    
    int size() const;
    void normalize(); //normalizza il vettore
    void filling(); //riempi il vettore con indici consecutivi
    double norm_l2();
    void Print();
    double& operator()(int i);
    myvec& operator=(const myvec& v);
    myvec& operator+(const myvec& v, const myvec& w);

};

  
myvec::myvec(int dim){
        dimension = dim;
        data = new double[dim];
        
        for(int i=0;i<dimension;i++){
            data[i] = 0.0;
        }
    }
    

    
    myvec::myvec(const myvec& v){
        int dimensione = v.size();
        data = new double[dimensione];
        for(int i=0;i<dimensione;i++){
            data[i] = v.data[i];
        }
    }
    
   
    
    myvec::~myvec(){ //destructor
        dimension = 0;
        delete[] data;
        data = NULL;
    }
    
    
    int myvec::size() const{
        return dimension;
    }


    
    double& myvec::operator()(int i){
        return data[i];                
    }
    
    myvec& myvec::operator=(const myvec& v){
        
        int dim  = v.size();
        for (int i = 0; i < dim; ++i){
            data[i] = v.data[i]; 
        }
        return *this;
}
    
    myvec& myvec::operator+(const myvec& v, const myvec& w){
     int d = v.size();
        myvec x(10);
        for(int i=0;i<d;i++){
            x(i)=v(i)+w(i);
        }
       return x;
    }
      
   
   
   
   
    void myvec::normalize(){
        double temp = 1.0/norm_l2();
        for(int i =0 ;i<dimension;i++){
            data[i] = data[i]*temp;
        }
    }
    
    void myvec::filling(){
        for (int i=0;i<dimension;i++){
            data[i] = i+1;
        }
    }
    double myvec::norm_l2(){
        double norm = 0.0;
        for (int i=0;i<dimension;i++){
            norm += data[i]*data[i];
        }
        return sqrt(norm);
    }
    
    void myvec::Print(){
        for(int i=0;i<dimension;i++){
            cout << data[i]<<endl;
        }
    }
    
    
    

int main(int argc, char**argv) {

    myvec vett1(10);
    vett1(3) = 6.0;
    vett1(8) = 9.0;

    
    myvec vett2(10);
    vett2(4) = 2.0;
    myvec sum(10);
    
    myvec vett3(10);
    vett3 = vett2; //check operatore =
    vett3.Print();

    
    //SOMMA
    //myvec sum(10);
    //sum = myvec + myvec2; //check operatore +
    
       
    

    return 0;
}






Grazie a chiunque possa darmi una mano!

4 Risposte

  • Re: Overloading operator + in classe Vettore

    Consiglio spassionato: evita di perdere tempo con queste feature del linguaggio e concentrati sui problemi reali che devi affrontare.

    In ogni caso hai sbagliato a fare il +
    
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    
    using namespace std;
    
    class myvec{
    private:
        int dimension;
        double *data;
       
    public:
        myvec(int dim);
        myvec(const myvec &v);
         ~myvec();
         
        
        int size() const;
        void normalize(); //normalizza il vettore
        void filling(); //riempi il vettore con indici consecutivi
        double norm_l2();
        void Print();
        double& operator()(int i);
        myvec& operator=(const myvec& v);
        myvec operator+(const myvec& v);
    
    };
     
    myvec::myvec(int dim){
        dimension = dim;
        data = new double[dim];
            
        for(int i=0;i<dimension;i++)
            data[i] = 0.0;
    }
          
    myvec::myvec(const myvec& v){
        int dimensione = v.size();
        data = new double[dimensione];
        for(int i=0;i<dimensione;i++)
            data[i] = v.data[i];
    }
           
    myvec::~myvec(){ //destructor
        dimension = 0;
        delete[] data;
        data = NULL;
    }
        
    int myvec::size() const{
        return dimension;
    }
    
    double& myvec::operator()(int i){
        return data[i];                
    }
        
    myvec& myvec::operator=(const myvec& v){ 
        int dim  = v.size();
        for (int i = 0; i < dim; ++i)
            data[i] = v.data[i]; 
        return *this;
    }
        
    myvec myvec::operator+(const myvec& v){
        int d = v.size();
        myvec x(d);
        for(int i = 0; i < d; i++)
            x(i) = this->data[i] + v.data[i];
        return x;
    }
                   
    void myvec::normalize(){
        double temp = 1.0/norm_l2();
        for(int i = 0; i < dimension; i++)
            data[i] *= temp;
    }
        
    void myvec::filling(){
        for (int i = 0; i < dimension;i++)
            data[i] = i + 1;
    }
    
    double myvec::norm_l2(){
        double norm = 0.0;
        for (int i = 0; i < dimension; i++)
            norm += data[i]*data[i];
        return sqrt(norm);
    }
        
    void myvec::Print(){
        for(int i = 0; i < dimension; i++)
            cout << data[i] << endl;
        cout << endl;
    }
        
        
    int main(int argc, char**argv) {
    
        myvec vett1(10);
        vett1(3) = 6.0;
        vett1(4) = 1.5;
        vett1(8) = 9.0;
        vett1.Print();
    
        
        myvec vett2(10);
        vett2(4) = 2.0;
        vett2.Print();
        
        myvec vett3(10);
        vett3 = vett2; //check operatore =
        vett3.Print();
    
        
        myvec sum(10);
        sum = vett1 + vett2; //check operatore +
        sum.Print();    
    
        return 0;
    }
    
    
  • Re: Overloading operator + in classe Vettore

    Grazie mille per la correzione! Solo una domanda: se avessi voluto passare due parametri, cioè come scrivevo in OP:
    myvec myvec::operator+(const myvec& v,const myvec& w)
    come avrei potuto fare?

    Grazie anche per il consiglio Onestamente, è una cosa che non avevo mai fatto e voleva farla giusto per vederla almeno una volta, dal momento che utilizzo C++ solo per calcolo scientifico/analisi numerica
  • Re: Overloading operator + in classe Vettore

    Ci sono DUE modi per fare l'overloading di un operatore:

    1) definirlo GLOBALMENTE,cioe' NON dentro una classe, nel qual caso e':
    
      T operator +(const T& a, const T& b)
    
    2) definirlo DENTRO una classe, nel qual caso e':
    
    class C {
       ...
       C operator +(const C& b);
       ...
    }
    
    Nota che non c'e' "a", perche' "a" e' "*this".

    NON PUOI CAMBIARE la signature ("firma") dell'operatore!!!

    Comunque, queste sono cose abbastanza ""avanzate"", per programmatori esperti.
    Al momento puo' tranquillamente lavorare usando NORMALI metodi "add","sum","mul", ecc ...
  • Re: Overloading operator + in classe Vettore

    Ti ringrazio @migliorabile, chiaro. La seconda opzione è ciò che ha proposto Weiersrass.

    Oltretutto, mi sono accorto di un errore grave che ho commesso, e cioè il risultato nel mio overloading ho ritornato una reference ad un oggetto locale. Sarebbe stato più corretto scrivere
    myvec operator+(const myvec& v, const myvec& w);
Devi accedere o registrarti per scrivere nel forum
4 risposte