Frage

Liebe Freunde, ich bin besorgt, wenn ich eine schlechte Verwendung von Referenzen in C ++ zu machen bin Im folgenden Verfahren GCC beschwert „Verweis auf lokale Variable‚me‘zurück“

Warnung
MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
  MatrizEsparsa me(outra.linhas(),outra.colunas());
  return me;
}

Aber mit folgenden Änderungen der Warnung verschwindet:

MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
  MatrizEsparsa me(outra.linhas(),outra.colunas());
  MatrizEsparsa &ref = me;
  return ref;
}

Ist das erstere Verfahren (Rückführung der 'ref' Variable) korrekt \ akzeptabel?

War es hilfreich?

Lösung

Nein. ref noch bezieht sich auf me, die am Ende des Anrufs zerstört werden.

Sie sollen eine Kopie Ihres Ergebnis zurück (nicht von & Präfix).

MatrizEsparsa MatrizEsparsa::operator+(const MatrizEsparsa& outra) const {
    return MatrizEsparsa(outra.linhas(),outra.colunas());
}

Ich habe auch zwei const Bezeich (den Parameter und die Methode), da ich bezweifle outra oder die anrufende Instanz muß in diesem Fall modifiziert werden. (Ich könnte falsch sein, aber dann operator+ würde eine seltsame semantische)

Mit dem zu tun, was Sie getan haben, müssen Sie nur den Code komplizierter gemacht. Der Compiler wurde wahrscheinlich verwirrt und konnte man nicht über Ihren möglichen Fehler warnen.

Normalerweise, wenn Sie clevere Tricks zu verwenden, haben einfache Dinge zu tun, bedeutet es etwas falsch ist.

Andere Tipps

Ich glaube, Sie verwechseln Ihre Betreiber.

Es gibt 2:

struct Foo
{
  Foo& operator+=(Foo const&);
  Foo operator+(Foo const&) const;
};

Wie Sie bemerken, die erste gibt einen Verweis auf sich selbst, die zweite nicht.

Auch in der Regel sollte die zweite als freie Funktion geschrieben werden.

Foo operator+(Foo const&, Foo const&);

Dies automatisiert werden kann, weil es umständlich, mit Boost.Operators:

struct Foo: boost::addable<Foo>
{
  Foo& operator+=(Foo const& rhs)
  {
    // add
    return *this;
  }
};

Die kleine boost::addable Magie wird die + Implementierung automatisch generiert basierend auf Foo::operator+=.

Es ist nicht akzeptabel. Es ist eigentlich das gleiche Problem: a. Nicht konstante Referenz auf ein lokales Objekt zurückkehrt, die nach der Rückkehr des Verfahrens zerstört werden

Nein, Sie müssen hier einen Wert zurückgeben, idealerweise einen const Wert. Siehe Effective C ++, Punkt 21.

Ich schlage vor, die folgende Schnittstelle:

const MatrizEsparsa operator+(const MatrizEsparsa& left, const MatrizEsparsa& right);

Beachten Sie, dass alles ist entweder eine const Referenz oder ein const Wert. einen const Wert der Rückkehr ist nicht so wichtig wie Wert oder deklarieren Sie die Parameter wie const Referenzen Rückkehr, aber die Argumente von Scott Meyers haben mich überzeugt, obwohl sie niemand folgt.

Sie können nicht zurück die Referenz, da das Objekt Sie verweisen wird außerhalb Ihrer Kontrolle bekommen zerstört. Entweder put „me“ als Mitglied Variable MatrizEsparsa, so dass es nach der Ausführung der Funktion sonst einen Zeiger oder einen Schub smart_ptr, dass Punkte auf das Objekt anhalten wird.

, da dies zu sehen, ist ein Operator + obwohl Sie wahrscheinlich einen Wert eher als ein Verweis auf eine Variable intern in die Funktion zurückkehren wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top