Wenn die Rückgabe eines Zeigers, Skalar-und Referenz-in C++?

Ich bin bewegt von Java zu C++ und bin ein bisschen verwirrt von der Sprache, die Flexibilität. Ein Punkt ist, dass es gibt drei Möglichkeiten, um Objekte zu speichern: ein Zeiger, Eine Referenz und ein Skalar (das speichern des Objekts selbst, wenn ich es richtig verstanden habe).

Ich Neige dazu, verwenden Sie Referenzen, wo dies möglich ist, denn das ist, wie nah an Java wie möglich. In einigen Fällen, z.B. Getter für abgeleitete Attribute ist dies nicht möglich:

MyType &MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

Diese nicht kompilieren, weil t besteht nur im Rahmen des getSomeAttribute() und wenn ich wieder ein Verweis darauf, es würde den Punkt im nirgendwo, bevor der client es benutzen kann.

Daher bin ich Links mit zwei Optionen:

  1. Gibt einen Zeiger
  2. Rückgabe eines skalaren

Rückgabe einen Zeiger würde dann so Aussehen:

MyType *MyClass::getSomeAttribute() {
    MyType *t = new MyType;
    return t;
}

Dieser funktionieren würde, aber der Kunde hätte dies zu prüfen Zeiger für NULL um wirklich sicher sein, etwas, das nicht notwendig mit Referenzen. Ein weiteres problem ist, dass der Anrufer sicherstellen, dass t freigegeben ist, würde ich eher nicht deal mit, dass, wenn ich es vermeiden kann.

Die alternative wäre die Rückkehr auf das Objekt selbst (Skalar):

MyType MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

Dass ist ziemlich einfach und nur was soll ich in diesem Fall: Es fühlt sich an wie eine Referenz, und es kann nicht null sein. Wenn das Objekt außerhalb des Bereichs befindet, in der client-code wird gelöscht. Ziemlich praktisch. Ich habe jedoch selten das jemand tut, gibt es einen Grund für das? Gibt es irgendeine Art von performance-problem, wenn ich wieder ein Skalar statt ein Zeiger oder ein Verweis?

Was ist der häufigste/eleganter Ansatz, dieses problem zu behandeln?

  • "Ich bin bewegt von Java zu C++" bedeutet nichts. Ist Java nicht C++. Java wird nie C++. Denken Sie über Java beim Programmieren mit C++ ist nicht zu helfen, Sie verstehen, C++ oder Ihnen helfen, gute Entscheidungen zu treffen. Jede Sprache wird Ihnen nicht helfen, das Programm gute C++ - Ausnahme C++, also vergessen Sie Sie wissen, alle anderen Sprachen, weil Sie nicht C++. Sie müssen lernen, C++, wenn Sie möchten, Programmieren in C++, nicht versuchen sich zu ändern eine bereits vorhandene Sprache in C++, denn das wird nicht funktionieren, da nur C++ ist C++. Kann ich empfehlen ein gutes Buch?
  • Eine Referenz ist nicht in der Nähe, was Java tut. Die nächste Sprache, die nur konstruieren zu Java wäre die Rückgabe eines Zeigers an. Aber das bedeutet nicht das Konto für die Verwaltung des Speichers. So die nächsten C++ - Konstrukt von Java würde die Rückkehr ein shared pointer. std::tr1::shared_ptr<T> (oder std::shared_ptr<T> oder boost::shared_ptr (je nachdem, welche version Sie verwenden)). Sie können neue und vergessen, zu Ihrem Herzen Inhalt und in der Regel wird das Objekt der garbage Collection freigegeben wird, richtig. Aber C++ ist nicht Java. Sie müssen lernen, wie man Werte richtig. Bitte bringen Sie Java-Konzepte von C++, die Sprachen sind nur anders.
  • Ok also C++ ist nicht Java, aber ignorieren Sprache Besonderheiten. Ideen, ausgedrückt in Java übersetzt werden können, um C++. Ich habe oft das Programm in einer Anzahl von Sprachen, die oft die syntax unterscheidet sich, nicht aber die Semantik.
  • ist nicht 'unbedingt', und in diesem Fall es ist nicht nur Semantik. "Ideen" ist so ein allgemeiner Begriff deine Argumentation ist weder widerlegbar bzw. sinnvoll ist. C++ und Java sind unterschiedliche Sprachen, und Sie tun die Dinge auf unterschiedliche Weise. Die "Ideen", die übereinstimmen, sind Grundlagen wie z.B. dem ausführen von Anweisungen, und sagen Sie nichts über design-Entscheidungen.
  • Das ist ein Missverständnis.
  • Mit Hilfe der "Vergleichenden Analyse" ist eine sehr menschliche und sehr Häufig, was zu tun ist. Ich habe festgestellt, dass es ein großartiges Werkzeug, um zu helfen, lehren die Menschen. Ich werde nie verstehen, die "Folgen der Herde, geschlossen-mind" - Ansatz.
  • Sie haben nicht zu prüfen, die Rückkehr der new für NULL oder nullptr. new garantiert eine exception werfen, auf allocation failure.

InformationsquelleAutor theone | 2010-08-07
Schreibe einen Kommentar