2009-06-25 16 views
3

Ich bin mir nicht sicher, obVerwenden Sie * dies eine gute Idee?

return *this 

der einzige Weg ist, dass wir eine Instanz einer Klasse zurückgeben könnten, die eine Member-Funktion genannt? Der Grund, warum ich gefragt habe, ist, weil unser Lehrer uns gesagt hat, dass wir vermeiden sollten, Zeiger zu verwenden, wenn nötig, und ich frage mich, ob dies ein Fall ist, wo der einzige notwendige Weg es ist, den this Zeiger zurückzugeben.

Ich arbeite mit einer Bruchklasse, die private Datenmitglieder Zähler und Nenner enthält. Die Member-Funktion ich spreche wird verwendet, um zwei Fraktionen beispielsweise hinzufügen:

Fraction C = A.plus(B); 

Plus Elementfunktion wie folgt definiert ist:

Fraction& plus(const Fraction frac) 

Der Trainer will, dass wir C = A + = tun B, also denke ich, deshalb.

+13

Holen Sie sich einen neuen Lehrer. –

+1

Soll Plus in Ihrem Beispiel A ändern? Wenn nicht, sollten Sie ein neues Fraction-Objekt zurückgeben, das die Summe von A und B darstellt. –

Antwort

7

Holen Sie sich einen neuen Lehrer. Es sieht so aus, als wäre die Deklaration von plus() völlig falsch.

  • es wahrscheinlich einen Wert eher als eine Referenz
  • wenn es einen Verweis zurückgeben soll, muss zurückkehren, sollte es eine konstante Referenz zurückgeben
  • es
eine konstante Referenz als Parameter auf jeden Fall nehmen soll

Das ist für wahrscheinlich sinnvolle Implementierungen einer Element plus() - Funktion. Natürlich sollte es wahrscheinlich ein Freund sein.

+0

Sie lesen meine Meinung in Ihrem ersten Punkt: D – AraK

+0

Ich denke, das ist eher ein schlechter Schüler die Frage falsch kopieren, dass ein schlechter Lehrer. Ich würde argumentieren lieber auf einen Zeiger verweisen. Und die Rückgabe gibt eine Referenz zurück, nicht einen Zeiger, der vom Lehrer erneut getestet wurde. –

+0

Die Deklaration ist in Ordnung, wenn Sie annehmen, dass "plus" mit "operator + =" übereinstimmt, und dass Sie erwarten, dass die Übergabe nach Wert schneller ist als die Übergabe als Referenz. (Ich wäre nicht überrascht, wenn das hier der Fall wäre) –

1

Ja, das ist der einzige Weg. Die einzige Möglichkeit, auf das aktuelle Objekt in einer Methode zuzugreifen, ist dies, und es ist ein Zeiger.

Es ist in Ordnung, und ist eine anerkannte Praxis.

1

Es ist nichts falsch mit der Rückkehr *this. So sollten zum Beispiel Überladungen modifizierender Operatoren funktionieren. Es scheint, als ob die Plus-Methode wirklich nur eine Möglichkeit ist, einen Operator + = für Ihre Klasse bereitzustellen, ohne den Operator tatsächlich zu überlasten (ich nehme an, Sie sind noch nicht zum Überladen des Operators gekommen). In diesem Fall ist das übliche Verhalten *this.

0

In Ihrer plus() Methode sollten Sie wahrscheinlich ein neues Fraction Objekt erstellen und das zurückgeben, anstatt das aktuelle zu ändern und dann *this zurückgeben. Sie möchten wahrscheinlich nicht A in A.plus(B) ändern. Um einen neuen Fraction zurückzukehren, würde die Unterschrift von plus() am besten:

Fraction plus(const Fraction &frac); 

(Falls Sie sich derzeit nicht this im plus() Verfahren zu modifizieren, warum wollen Sie *this zurückkehren?)

2

I denke in diesem Fall ist es sicher

return *this 

zu verwenden, da this auf das aktuelle Objekt verweist, so dass es existiert garantiert wird, so wird es nicht null sein .

Der Grund plus wieder auf sich selbst verweisen, so dass sie verkettet werden können:

dass
Fraction C = A.plus(B).plus(D) // perhaps? 

Hinweis im obigen Fall C wird durch Kopieren des Ergebnisses der Addition erzeugt werden. Dies setzt auch voraus, dass die Operation plus das Objekt (in diesem Fall A) ändern und den Verweis auf dieses geänderte Objekt zurückgeben soll.

Würde Plus keine Referenz akzeptieren, anstatt eine Kopie des Parameters zu erstellen?

Fraction& plus(const Fraction& frac) 

Dies ist ähnlich wie Sie operator= (ein Beispiel) implementieren würde: Objekt

A& operator=(const A& right) { 
    if(this == &right) return *this; // Handle self-assignment 
    b = right.b; 
    return *this; 
    } 

Vielleicht ändern Sie möchte nicht und das Rück neues Objekt:

// assuming there's a constructor Fraction(int numerator, int denominator): 
Fraction* plus(Fraction const& rhs) 
{ 
    return new Fraction(numerator * rhs.denominator 
         + rhs.numerator * denominator, 
         denominator * rhs.denominator); 
} 

Aber diese muss natürlich Zeiger auf neue Instanz zurückgeben, die keine Referenz ist, wie sie in Ihrer Aufgabe (?) benötigt wird.

Oder noch besser:

Fraction plus(Fraction const& rhs) 
{ 
    return Fraction(numerator * rhs.denominator 
        + rhs.numerator * denominator, 
        denominator * rhs.denominator); 
} 

Diese Funktion Fraktion im Raum des Aufrufs schaffen so bei der Rückkehr kein Aufwand für das Kopieren Struktur gibt.

+0

Tatsächlich ist dies nicht garantiert, dass es nicht null ist. Der Aufruf einer Methode für ein NULL-Objekt führt zu einem Absturz, wenn dieser dereferenziert wird. – Michael

+0

Aber in diesem Fall würdest du einen Absturz bekommen, wenn du versuchst, plus on NULL nicht plus plus anzurufen, wenn du versuchst zurückzukehren * dies nehme ich an – stefanB

+0

Du würdest nur beim Aufruf abstürzen, wenn die Funktion virtuell ist, da sie versuchen würde auf die zuzugreifen vtabelle. Ansonsten ist es so, als würde man eine Nicht-Member-Funktion mit einem ungültigen Parameter aufrufen. – Michael

0

Ich glaube, dass die Semantik sein sollte, dass die Elementfunktion 'plus' ein 'neues' Objekt zurückgibt, das die Summe des Aufrufers und des Aufrufs darstellt. Notiz :: neu bedeutet nicht, ‚neues‘ Schlüsselwort in C++ :) so für Ihr Beispiel

// the constructor accepts (numerator, denominator). 
// in your case, the caller object would be A, and the called object would be B(other). 
return Fraction(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator); 

Der einzige Ort, wo ich es sehe richtig einen Verweis auf diese zurück, wenn Sie Betreiber überlasten, die Seite zu haben Auswirkungen.

mehr Um zu klären, sollte dies Ihr ‚Plus‘ Signatur sein,

Fraction plus(const Fraction& frac); 

weder der Anrufer noch der sollte von der ‚Plus‘ erfolgt aufgerufen werden.

0

unser Lehrer sagte uns notwendig, mit Hilfe von Zeigern zu vermeiden, wenn

Sie tatsächlich den Wert von dereferencing einen Zeiger zurückkehren, nicht der Zeiger. Du solltest also gut sein.

Persönlich, ich nie explizit Methoden aufrufen oder beziehen sich auf Mitglieder über this. Das heißt, ich nicht tun folgendes:

class A { 
    public: 
    int x; 
    int get_x() 
    { 
     return this->x; 
    } 

    int get_x_plus_5() 
    { 
     return this->get_x() + 5; 
    } 
} 

Ich bin aber völlig in Ordnung mit *this zurück.

Ihr Lehrer versucht wahrscheinlich, dass Sie vermeiden (1) Zeiger auf Objekte auf dem Stapel von Funktionen zurückgeben (was bedeutet, dass sie nach dem Beenden der Funktion nicht existieren) und (2) Objekte auf dem freien Speicher zuweisen wenn du nicht musst. this leidet nicht unter diesen beiden Problemen.

Verwandte Themen