Rücksendung eine Kopie des Objekts selbst in C++
Ok, Also habe ich gegoogelt das problem und ich habe gesucht stack overflow, aber ich kann nicht scheinen zu finden, eine gute Antwort. Also, ich bin mit der Frage auf, dass hier ist insbesondere zu meinem problem. Wenn es eine einfache Antwort, bitte schön, ich bin neu in der Sprache. Hier ist mein problem:
Bin ich zu schreiben versucht, eine Methode für eine Klasse in C++ ist das überladen eines operators. Ich möchte Rücksendung eine Kopie der Instanz geändert, aber nicht die Instanz selbst. Für einfache Beispiel verwende ich eine BigInt
Klasse um das problem zu demonstrieren, dass ich habe.
Wenn ich den folgenden code:
const BigInt & operator+() const //returns a positive of the number
{
BigInt returnValue = *this; //this is where I THINK the problem is
returnValue.makepositve(); //for examples sake
return returnValue;
}
Bekomme ich die Fehlermeldung, dass der return-Wert kann erstellt wurden, auf den Stapel. Ich weiß, dass dies bedeutet, dass ich zum erstellen des Objekts auf dem heap, und geben Sie den Verweis zurück. Aber Wenn ich zu ändern 3rd - Zeile so etwas wie:
BigInt & returnValue = *this;
Bekomme ich eine Fehlermeldung sagt mir, dass die syntax nicht stimmt. Ich bin mir nicht wirklich sicher, was zu tun, jede Hilfe ist sehr willkommen!
InformationsquelleAutor | 2010-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist in Ihrer Funktion Unterschrift. Sie müssen unbedingt wieder die gesamte Objekt und nicht nur ein Verweis.
Ihre Funktion wie folgt Aussehen wird
Nein, Sie können erstellen Sie es auf dem Stapel.
Nein, c/c++ - kopieren Sie den return-Wert aus der genannten stack-frame zu den vorherigen. Im Grunde, was das bedeutet, ist, wenn Sie nicht über einen Zeiger, das Objekt wird kopiert, wenn zurückgegeben. (Primitive wie Zeiger bekommen auch 'kopiert', aber Sie werden nicht bemerken, weil Sie nur auf das gleiche Objekt zeigen.)
InformationsquelleAutor Gab Royer
Könnte man genauso gut machen, den Rückgabewert des operators
BigInt
. Dann wird der copy Konstruktor passieren wird, automatisch auf die Rückkehr:Jetzt sieht es aus wie ein copy-Konstruktor wird zweimal geschehen, einmal im inneren der Betreiber und eine andere, wenn die Funktion zurückgibt, aber mit Return-Wert-Optimierung, es wird eigentlich nur einmal geschehen, also Leistung klug, es ist so gut wie es geht.
InformationsquelleAutor Igor Zevaka
Mein C++ ist etwas eingerostet, aber was ist mit:
Das problem bei diesem Ansatz ist, dass Sie am Ende undicht Speicher. Wie werden Sie löschen Sie Ihre neu erstellte Objekt? Es wäre auch new BigInt (*)
InformationsquelleAutor Timores
Beachten Sie, dass das überladen von Operatoren soll die intuitive Semantik. Definieren von einfachen
+
zu meinen "absoluten Wert", wie Sie im Beispiel-code zur Verfügung gestellt, ist sehr verwirrend für Kunden. Operatoren für benutzerdefinierte Typen sollten sich Verhalten wie auf dem built-in-Typen. Zum Beispiel+(-5)
Erträge -5, nicht +5. Damit wird die Implementierung vonoperator+
sollte wie folgt Aussehen:Wenn Sie möchten, um eine absolute value-Funktion, dann so:
InformationsquelleAutor fredoverflow
versuchen
this
ist ein Zeiger, d.h.BigInt*
und nicht zugeordnet werden können, zu einer Referenz.InformationsquelleAutor Lucas