Ich ziehe von Java zu C++ um und bin etwas verwirrt von der Flexibilität der Sprache. Ein Punkt ist, dass es drei Möglichkeiten gibt, Objekte zu speichern: Einen Zeiger, eine Referenz und einen Skalar (das Objekt selbst wird gespeichert, wenn ich es richtig verstehe).Wann soll ein Zeiger, Skalar und Referenz in C++ zurückgegeben werden?
Ich neige dazu, Referenzen wo möglich zu verwenden, weil das so nah wie möglich an Java ist. In einigen Fällen, z.B. Getter für Attribute abgeleitet, ist dies nicht möglich:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Diese nicht kompilieren, weil t
nur im Rahmen von getSomeAttribute()
existiert und wenn ich einen Hinweis darauf zurück, wäre es nirgendwo Punkt, bevor der Client sie verwenden können .
Deshalb bin ich mit zwei Optionen links:
- einen Zeiger
- Return ein Skalar
einen Zeiger zurückkehrend würde wie folgt aussehen:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Diese würde funktionieren, aber der Client müsste diesen Zeiger auf NULL
überprüfen, um zu sein wirklich sicher, etwas, das mit Referenzen nicht notwendig ist. Ein anderes Problem ist, dass der Anrufer sicherstellen muss, dass t
freigegeben ist, ich würde lieber nicht damit umgehen, wenn ich es vermeiden kann.
Die Alternative wäre, das Objekt selbst (Skalar) zurückzukehren:
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Das ist ziemlich einfach ist und genau das, was ich in diesem Fall will: Es ist wie eine Referenz fühlt und es kann nicht null sein. Wenn das Objekt nicht im Gültigkeitsbereich des Clients enthalten ist, wird es gelöscht. Ziemlich praktisch. Aber ich sehe selten jemanden, der das macht, gibt es einen Grund dafür? Gibt es eine Art Leistungsproblem, wenn ich einen Skalar anstelle eines Zeigers oder einer Referenz zurückgebe?
Was ist der häufigste/eleganteste Ansatz, um dieses Problem zu lösen?
"Ich ziehe von Java nach C++" bedeutet nichts. Java ist nicht C++. Java wird niemals C++ sein. Das Nachdenken über Java während der Programmierung von C++ hilft Ihnen nicht, C++ zu verstehen oder Ihnen zu helfen, gute Entscheidungen zu treffen. Jede Sprache wird Ihnen nicht helfen, gutes C++ außer C++ zu programmieren, also vergessen Sie, andere Sprachen zu kennen, weil sie nicht C++ sind. Sie müssen lernen, C++, wenn Sie in C++ programmieren möchten, nicht versuchen, eine bereits vorhandene Sprache in C++ zu verwandeln, weil das nicht funktioniert, da nur C++ C++ ist. [Könnte ich ein gutes Buch vorschlagen?] (Http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – GManNickG
Ein Verweis ist nicht nahe, was Java tut. Die nächste Sprache, die nur für Java konstruiert wird, wäre die Rückgabe eines Zeigers. Das berücksichtigt jedoch nicht die Speicherverwaltung. Das nächste C++ - Konstrukt für Java wäre also die Rückgabe eines gemeinsamen Zeigers. std :: tr1 :: shared_ptr (oder std :: shared_ptr oder boost :: shared_ptr (je nachdem, welche Version Sie verwenden)). Sie können neu und nach Herzenslust Inhalt vergessen und in der Regel wird das Objekt Müll korrekt gesammelt. Aber C++ ist kein Java. Sie müssen lernen, wie Sie Werte korrekt verwenden. Bringen Sie Java-Konzepte nicht in C++, die Sprachen sind einfach anders. –
@ Gman - Ok, also C++ ist nicht Java, aber ignorieren Sprachspezifikationen. In Java ausgedrückte Ideen können in C++ übersetzt werden. Ich programmiere oft in mehreren Sprachen, oft unterscheidet sich die Syntax aber nicht die Semantik. – brumScouse