Objekt zurückgeben

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hey,
    was ist die eleganteste Weise ein Objekt zurückzugeben?
    Ich habe versucht das ganze über Referenzen zu machen, aber krieg die ganze Zeit Heap/Pointer-Fehler, da das Objekt außerhalb des Scopes ist.
    Kleines Beispiel wie ich es bisher gemacht habe:

    Das funktioniert nicht, weil der Pointer auf objekt ja gelöscht wird (wenn z.B. das komplette KlasseA-Objekt gelöscht wird)

    Nach ein wenig rumgooglerei hab ich ein paar andere Konzepte gefunden..
    1.) per static zurückgeben.. also ein statisches Objekt in getObjekt() erstellen und das dann zurückgeben.
    Will ich ungern machen, weil sich das relativ unsauber anfühlt irgendwelche statischen Objekte in einer Funktion zu erstellen, die dann die ganze Zeit im Speicher rumschwirren.
    2) per new ein Objekt erstellen. Also innerhalb von getObjekt per new ein Objekt erstellen. Will ich aber auch nicht machen, weil ich im Verlauf der Programmierung mit Sicherheit vergessen werde, dass immer wenn ich KlasseB *ptr = getObjekt() aufrufe ich immer ptr löschen muss. Da ich ansonsten so gut wie nie mit new/delete arbeite.
    3) Referenz auf das Objekt als Parameter mitübergeben. So mache ich das aktuell auch:

    Code
    class KlasseA {
    private:  
       KlasseB *objekt;
    
    
    public:
       void getObjekt(KlasseB& inputObjekt){
    inputObjekt = *objekt;}
    };

    Aber es muss doch irgendwie möglich sein einfach ein normales Objekt zurückzugeben ala
    KlasseB objekt = KlasseA.getObjekt();
    über ein Kopierkonstruktor oder sowas. Ich möchte nicht auf das Objekt mit dem identischen Speicherbereich aus KlasseA zugreifen, ich möchte einfach nur eine flache Kopie von dem objekt aus KlasseA in mein objekt in der main-methode haben..

    Einmal editiert, zuletzt von madman (28. April 2016 um 23:59)

  • Hallo,
    So ganz genau habe ich noch nicht verstanden, was dein Ziel ist, du hast innerhalb einer Klasse nur einen Pointer auf ein Objekt, was du außerhalb der Klasse aber als "normales" Objekt haben möchtest?
    Eine (standardmäßig flache) Kopie des Objekts wäre auf jeden Fall möglich, indem du bei deinem ersten Beispiel das & weglässt.
    Ansonsten helfen dir vllt. auch shared pointer wenn du beim Verwenden von new/delete unsicher bist.

    Gruß
    Chris

  • Wenn du wirklich zurecht kommst mit einer flachen Kopie des Objektes solltest du das so machen koennen (wenn du bei deiner Heap-Allokation bleibst):

    Code
    class KlasseA {
    private:  
       KlasseB *objekt;
    
    
    public:
       KlasseB  getObjekt() {
         return *object; // dereferenzieren ruft Kopierkonstruktor auf
     }
    };

    Das ist allerdings ein ungewoehnliches Vorgehen: auf der einen Seite Wertesemantik in getObject (also immer Kopien machen), auf der anderen Seite Heap-Allokation.

    Stattdessen wuerde man objekt gleich vom Typ KlasseB (also nicht KlasseB*!) machen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!