Wie man ein Klassenobjekt durch Verweis in C ++ zurückgibt?
Habe ich eine Klasse namens Object speichert einige Daten.
Ich möchte es zurückgeben, indem Sie die Referenz über eine Funktion wie diese:
Object& return_Object();
Dann in meinem code, ich würde es so nennen:
Object myObject = return_Object();
Habe ich code geschrieben wie dieses, und es kompiliert. Allerdings, wenn ich den code ausführen, ich konsequent erhalten einen seg fault. Was ist der richtige Weg, um wieder ein class-Objekt durch die Referenz?
Kommentar zu dem Problem - Öffnen
sollte nicht myObject eine Referenz?
Sie können die Antwort finden Sie hier: stackoverflow.com/questions/3350385/...
Sie können Wege finden Sie hier: stackoverflow.com/questions/3350385/...
InformationsquelleAutor der Frage user788171 | 2012-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist wahrscheinlich der Rückgabe ein Objekt, das auf dem Stapel. Das ist
return_Object()
wahrscheinlich sieht so aus:Wenn dies ist, was Sie tun, sind Sie aus Glück heraus -
object_to_return
mehr Umfang und wurden zerstört am Endereturn_Object
, somyObject
bezieht sich auf ein nicht-existentes Objekt. Sie müssen entweder durch Rückkehr Wert, oder zurücksendenObject
erklärt in einem breiteren Umfang odernew
ed auf dem heap.InformationsquelleAutor der Antwort Chowlett
Können Sie nur verwenden,
wenn das zurückgegebene Objekt hat einen größeren Anwendungsbereich als die Funktion. Zum Beispiel, können Sie es verwenden, wenn Sie eine Klasse, wo es gekapselt ist. Wenn Sie ein Objekt erstellen in Ihrer Funktion, die Zeiger verwenden. Wenn Sie möchten, ändern Sie ein vorhandenes Objekt, übergeben es als argument.
InformationsquelleAutor der Antwort UmNyobe
Können Sie nur zurückgeben, nicht-lokale Objekte by reference. Der Destruktor haben kann ungültig erklärt einige interne Zeiger, oder was auch immer.
Keine Angst vor der Rückkehr Werte -- es ist schnell!
InformationsquelleAutor der Antwort spraff
Gut, es ist vielleicht nicht eine wirklich schöne Lösung in den code, aber es ist wirklich schön in die Schnittstelle der Funktion. Und es ist auch sehr effizient. Ideal ist es, wenn die zweite ist noch wichtiger für Sie (zum Beispiel, der Entwicklung einer Bibliothek).
Der trick ist dieser:
A a = b.make();
ist intern in einen Konstruktor von A, d.h. als wenn du geschrieben hättestA a(b.make());
.b.make()
Ergebnis sollte eine neue Klasse, mit einer callback-Funktion.Hier ist mein minimal-Beispiel. Aktivieren Sie nur die
main()
, wie Sie sehen können ist es einfach. Die Interna nicht.Aus der Sicht der Geschwindigkeit: die Größe eines
Factory::Mediator
Klasse nur 2 Zeiger, die mehr als 1 aber nicht mehr. Und dies ist das einzige Objekt in der gesamten Sache, die übertragen wird, durch den Wert.InformationsquelleAutor der Antwort peterh