Return by reference C++

di il
3 risposte

Return by reference C++

Salve, mi è stato assegnato di correggere questo codice:
#include <iostream>
#include <string>
using namespace std;

class Foo {

public:
  Foo() { name_ = ""; x_= 0; }
  Foo(const std::string& name, const double x) { name_ = name; x_ = x; }
  double value() const { return x_; }
  std::string name() const { return name_; }

  Foo operator=(const Foo& rhs) {
    Foo aFoo(rhs.name_,rhs.x_);
    cout << "--> In Foo::operator=: value: " << aFoo.value()
         << ", name: " << aFoo.name() << ", &aFoo: " << &aFoo
         << endl;
    return aFoo;
  }

  Foo operator+=(const Foo& rhs) {
    Foo aFoo(std::string(name_+"+"+rhs.name_), x_ + rhs.x_);
    cout << "--> In Foo::operator+=: value: " << aFoo.value()
         << ", name: " << aFoo.name() << ", &aFoo: " << &aFoo
         << endl;
    return aFoo;
  }

private:
  double x_;
  std::string name_;
};

// global function
ostream&  operator<<(ostream& os, const Foo& foo) {
  os << "Foo name: "  << foo.name() << " value: " << foo.value()
     << " address: " << &foo;
  return os;
}

int main() {
  Foo f1("f1",1.), f2("f2",2.), f3("f3",3.);

  cout << "Before f1+=f2 " << endl;
  f1 += f2;
  cout << "After f1+=f2\n" << f1 << endl;

  cout << "Before f1 = f3 " << endl;
  f1 = f3;
  cout << "After f1 = f3\n" << f1 << endl;

  return 0;
}
Quello che succede è nella foto allegata.

Cosi ho pensato di modificare i metodi che si occupano dell'overloading degli operatori:
Foo& operator=(Foo& rhs) {
    Foo aFoo(rhs.name_,rhs.x_);
    cout << "--> In Foo::operator=: value: " << aFoo.value()
         << ", name: " << aFoo.name() << ", &aFoo: " << &aFoo
         << endl;
    return *this;
  }

  Foo& operator+=(Foo& rhs) {
    Foo aFoo(std::string(name_+"+"+rhs.name_), x_ + rhs.x_);
    cout << "--> In Foo::operator+=: value: " << aFoo.value()
         << ", name: " << aFoo.name() << ", &aFoo: " << &aFoo
         << endl;
    return *this;
  }
Ma non sembra cambiare nulla. qualcuno sa aiutarmi?
Allegati:
27156_a4dec4d6e5b50bb0a9c4eddb625efa22.png
27156_a4dec4d6e5b50bb0a9c4eddb625efa22.png

3 Risposte

  • Re: Return by reference C++

    Ciao

    Per quanto riguarda gli overloading degli operatori = e +=:
    - per evitare copie inutili sarebbe meglio ritornare un reference;
    - oltre a ritornare *this, come giustamente hai corretto, non devi creare un nuovo oggetto, ma modificare name_ e x_ dell'oggetto corrente;
    - l'overloading dell'operatore di assegnazione è in questo caso del tutto superfluo e puoi tranquillamente utilizzare quello di default che si limita ad effettuare una semplice copia membro a membro.
  • Re: Return by reference C++

    Ciao, scusa la risposta tardiva, ho modificato le due funzioni in questo modo:
      Foo& operator=(Foo& rhs) {
        cout << "--> In Foo::operator=: value: " << rhs.value()
             << ", name: " << rhs.name() << ", &aFoo: " << &rhs
             << endl;
        name_ = rhs.name_;
        x_ = rhs.x_;
        return *this;
      }
    
      Foo& operator+=(Foo& rhs) {
        cout << "--> In Foo::operator+=: value: " << rhs.value()
             << ", name: " << rhs.name() << ", &aFoo: " << &rhs
             << endl;
        name_ = std::string(name_+"+"+rhs.name_);
        x_ += rhs.x_;
        return *this;
      }
    In output sul terminale ricevo:
    Before f1+=f2 
    --> In Foo::operator+=: value: 2, name: f2, &aFoo: 0x7bfd20
    After f1+=f2
    Foo name: f1+f2 value: 3 address: 0x7bfd50
    Before f1 = f3
    --> In Foo::operator=: value: 3, name: f3, &aFoo: 0x7bfcf0
    After f1 = f3
    Foo name: f3 value: 3 address: 0x7bfd50
    Non sembra sia cambiato molto
  • Re: Return by reference C++

    Sembra tutto corretto. Prima non lo era...
Devi accedere o registrarti per scrivere nel forum
3 risposte