Instanz in einem "pointer" speichern



  • Hallo,
    ich habe nur kurz eine Frage:
    ich habe eine Klasse mit einer Funktion, die gibt eine Instanz eines Objekts zurück

    Object TestClass::function();
    

    Jetzt rufe ich diese Funktion auf und möchte dieses Rückgabeobjekt gern in einen Pointer angeben.

    Object* o = new Object();
    TestClass* c = new class(); 
    o = c->function();
    

    Jedoch kommt dann ein assigning Fehler, ok das ist auch logisch:
    " error: assigning to 'Object *' from incompatible type 'Object'"

    Kann man die Instanz irgendwie dem Pointerobjekt übergeben ?
    Oder ist mein Gedanke da voll daneben und das ist nicht möglich.
    Also ich möchte auf den Inhalt des Objektes zugreifen. Jedoch hab ich halt die Instanz und im Porgramm nur den Pointer zu einem solchen Objekt.

    Kann man das nachvollziehen oder hab ich das nicht gut erklärt, was ich will?



  • @saebbi sagte in Instanz in einem "pointer" speichern:

    nur den Pointer zu einem solchen Objekt

    Warum?

    Wo kommt da CLI mit .NET ins Spiel?



  • @saebbi sagte in Instanz in einem "pointer" speichern:

    Object* o = new Object();
    TestClass* c = new class();
    o = c->function();

    Diese 3 Zeilen hätten schon ein Speicherloch (wenn die dritte Zeile denn korrekt wäre), weil du damit das in der ersten Zeile erzeugte o-Objekt verlieren würdest.

    Vermeide new, sofern möglich!

    Wenn Pointer, dann nimm smart pointer:

    std::unique_ptr<TestClass> c = std::make_unique<class>();  // class erbt von TestClass? (class ist kein gültiger Name!)
    // ansonsten, wenn dein class nicht eine vererbte Klasse sein soll, kannst du auch auto nehmen:
    auto c = std::make_unique<TestClass>();
    
    auto o = std::make_unique<Object>( c->function() ); // Achtung: hier kopierst du das Object dann
    

    Spricht bei dir etwas dagegen, ohne Pointer zu arbeiten?

    TestClass c;
    auto o = c.function();
    


  • @saebbi sagte in Instanz in einem "pointer" speichern:

    Object* o
    

    Wenn du so einen Zeiger hast, aber an das Objekt "hinter" dem Zeiger kommen willst, dann schreibst du einfach *o statt o.
    Also:

    Object* o = new Object();
    TestClass* c = new class(); 
    *o = c->function();
    


  • Man kann eine Instanz in einem Pointer speichern, indem man eine union macht. Die Instanz muss dazu aber genauso gross oder kleiner sein, wie der Pointer, denn sonst enthält die union noch einen Buffer ausserhalb des Pointers, der den Rest der Instanz hält. Dann ist die Instanz nicht wirklich vollständig in dem Pointer gespeichert, sondern nur der Anfang davon.


Log in to reply