2012-03-28 13 views
2

Mein erstes Mal die Einstellung der Überlastung Operator [] für etwas Praktisches und ich lief in etwas, das ich noch nie gedacht. Ich versuche, eine benutzerdefinierte Array-ähnliche Klasse, die Zeiger hält (und bietet einige einzigartige Funktionen). Das Zurückgeben eines der Zeiger aus meiner Klasse mit dem Operator [] ist offensichtlich, aber ich stellte mir auch die Möglichkeit vor, die Zieladresse des Zeigers von außen zu ändern. Vielleicht überlege ich das, aber würde eine Zuweisung auf den Rückgabewert (wie Fisch [0] = lpHatAddress;) einen Fehler verursachen, weil der zurückgegebene Wert nur eine Adresse ist?überladene Operator [] für beide Zugriff und einen Wert (C++)

Die einzige Lösung, die ich in der Lage bin zu denken, ist Zeiger auf Zeiger zu speichern, und das wäre doppelt so viel Speicherplatz verbrauchen. übersehe ich etwas offensichtlich? Gibt es einen sauberen Weg, dies zu tun?

+0

Zeigen Sie den Code Ihrer '[]' Überladung. Ich vertraue darauf, dass es einen Verweis auf ein Element zurückgibt. –

+1

Dies ist fast der Grund, warum Referenzen erfunden wurden. –

+0

@SethCarnegie Entschuldigung. Zu sagen, ich wäre rostig, wäre eine Untertreibung. : P – user980058

Antwort

3

Sie sollten das Ergebnis des Betreibers eine Referenz sein. Wenn also der Datentyp int ist, gibt der Operator eine int& zurück.

+0

Das kommt mir bekannt vor. Ich hatte völlig vergessen, dass die Rückkehr durch Referenz existierte. Ironisch, wie ich für dieses Zeug zur Universität ging, ließ mich die Hälfte dessen vergessen, was ich bereits wusste. XD – user980058

+0

@ user980058 Denken Sie daran, dass der einzige Grund, warum Sie als Referenz zurückgeben und kein undefiniertes Verhalten verursachen können, darin liegt, dass Sie die Objekte, die Sie zurückgeben, außerhalb des Bereichs der Funktion speichern, sodass die Referenz auf eine gültige verweist Speicherbereich auch nach dem Zurückkehren der Funktion. Stellen Sie sicher, dass Sie niemals einen Verweis auf eine lokale Variable zurückgeben (ich bin mir sicher, dass Sie das schon wussten, aber ich wollte nur sicher sein). –

1

Der Standard Trick ist, ein proxy (or surrogate) design pattern zu verwenden. Die Idee besteht darin, ein temporäres Objekt zurückzugeben, das den Zielzeiger umschließt, der sowohl eine Konvertierung in den Zeiger als auch eine Zuweisung T& unterstützt, die die Zuweisung an den Zielzeiger weiterleitet. Scott Meyer diskutiert dieses Muster in seinem Buch More Effective C++.