Zurückkehrend Referenzen aus einem C ++ Methoden
-
02-10-2019 - |
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“
WarnungMatrizEsparsa& 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?
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.