Unique_ptr in vector



  • Hallo,
    Ich verstehe nicht warum ich meinen unique_ptr<teilchen> nicht in einen vector speichern kann. Es funktioniert auch für den Konstruktor aber wenn ich nacher zugreifen will mit einer Funktion, ist der vector leer.
    Wenn ich nur unique_ptr<teilchen> erstelle, bleibt dieser und kann
    weiter verwendert werden, woran liegt das.

    simulation::simulation()
    {
    	cout << "hier ist die simulation" << endl;
    
    	vector<unique_ptr<teilchen>> Teilchen;
    	Teilchen.push_back(move(unique_ptr<teilchen>(new teilchen)));
    
    	Teilchen1 = move(unique_ptr<teilchen>(new teilchen));
    
    	Teilchen[0]->Einstellen();
    	Teilchen1->Einstellen();
    
    	Teilchen[0]->PositionSetzten(-5000, -5000);
    	Teilchen1->PositionSetzten(-10000, -10000);
    
    };
    

    Die Funktion wo es gebraucht wird:

    void simulation::antworten(programm& pprogramm) {
    
    	pprogramm.Fenster.draw(*Teilchen[0]->TeilchenGrafik);
    	pprogramm.Fenster.draw(*Teilchen1->TeilchenGrafik);
    }
    

    Ich vermute etwas mit Geltungsbereichen, blicke aber noch nicht durch...

    MfG,
    Rarebit.



  • Selbe Problem wie in deinem anderen Thread.
    Du erzeugst in deinem Konstruktor eine lokale Variable, diese befüllst.
    Verlässt du den Konstruktor, wird diese zerstört.
    In deiner antworten Funktion greifst du auf die Membervariable zu, diese hast du aber nie befüllt!

    Selbe Problematik ist auch ohne std::unique_ptr. Dessen Verwendung ist hier übrigens nicht nötig.



  • Also ich versuche das jetzt mal zu verstehen.
    Du meinst das der Vector lokal ist?
    Und daher kann ich nicht auf den Pointer zugreifen,
    weil dieser im Vektor gelöscht wird.

    Warum wird der der Pointer nicht gelöscht, er ist doch genau so in dem Geltungsbereich.
    Und was meinst du damit das er hier nicht von nören ist?

    Danke schon mal 🙂



  • 1 sekunde nachdenken, nachdem ganzen tag auf seinen code glotzen... sry

    verstanden!
    danke dir Nathan.



  • Die beiden move Aufrufe sind übrigens total überflüssig weil du bereits ein temporäres Objekt hast. Da brauchst du kein move mehr.


Anmelden zum Antworten