Problem mir erase() von Objekten in einem Vector



  • Hallo Leute ich hab eine Klasse erstellt und Objetkte dieser Klasse in einen Vector gepackt. Nun möchte ich ein Objekt aus dem Vector löschen aber bekomme dabei immer den gleichen Fehler -.- Hab schon etwas recherchiert und ich glaube der Fehler liegt irgendwo bei der übergabe von Referenzen im Konstruktor (kann aber auch ganz was anderes sein 😉 ) Hier zum Code:

    Header:

    #ifndef SKELETON_H
    #define SKELETON_H

    class Skeleton
    {

    public:
    Skeleton(RenderWindow &r_window, Player &r_player, float x, float y);
    int status;
    static Texture skeleton_texture;

    //Hab alles irrelevantes hier rausgelöscht
    };
    #endif

    CPP Datei:

    #include "Skeleton.h"

    Texture Skeleton::skeleton_texture;

    Skeleton::Skeleton(RenderWindow &r_window, Player &r_player, float x, float y)
    :window(r_window), player(r_player)
    {

    }

    Code wo die Objekte erstellt werden (includes etc vorhanden):

    std::vector <Skeleton> skeleton_vector;

    Skeleton skeleton1 = Skeleton(window, player, 100, 200);
    skeleton_vector.push_back(skeleton1);
    Skeleton skeleton2 = Skeleton(window, player, 1500 - 32, 200);
    skeleton_vector.push_back(skeleton2);

    ... //irrelevanter Code 😉

    for (unsigned int i = 0; i < skeleton_vector.size(); i++)
    {
    skeleton_vector[i].update();
    if (skeleton_vector[i].status == 0)
    {

    skeleton_vector.erase(skeleton_vector.begin() + i);
    }
    }

    Ich bekomme immer folgende Fehlermeldung:
    Die Funktion 'operator =' ist in 'Skeleton' nicht verfügbar

    Ich hoffe jemand kann mir helfen und bedanke mich schon im voraus 😉



  • Wo ist der Zusammenhang zwischen der Fehlermeldung und erase?


  • Mod



  • Der Fehler müsste doch hier auftreten oder?

    Skeleton skeleton1 = Skeleton(window, player, 100, 200); 
    skeleton_vector.push_back(skeleton1); 
    Skeleton skeleton2 = Skeleton(window, player, 1500 - 32, 200); 
    skeleton_vector.push_back(skeleton2);
    

    Lösung 1:

    Skeleton skeleton1(window, player, 100, 200); 
    skeleton_vector.push_back(skeleton1); 
    Skeleton skeleton2(window, player, 1500 - 32, 200); 
    skeleton_vector.push_back(skeleton2);
    

    Lösung 2:

    skeleton_vector.push_back(Skeleton(window, player, 100, 200)); 
    skeleton_vector.push_back(Skeleton(window, player, 1500 - 32, 200));
    

    Rückfrage:
    Sicher das std::vector der richtige Container für Dein Anwendungsfall ist?

    Ich schreibe, dass dann meistens so, um gewisse Elemente aus einem Vector zu filtern: (nur als eine mögliche Lösung)

    std::vector <Skeleton> tmp_skeleton_vector; 
    tmp_skeleton_vector.reserve(skeleton_vector.size());
    
    for (unsigned int i = 0; i < skeleton_vector.size(); i++) 
    { 
      skeleton_vector[i].update(); 
      if (skeleton_vector[i].status != 0) 
      { 
         tmp_skeleton_vector.push_back(skeleton_vector[i]);
      } 
    } 
    tmp_skeleton_vector.swap( skeleton_vector );
    


  • nebler schrieb:

    Der Fehler müsste doch hier auftreten oder?

    Skeleton skeleton1 = Skeleton(window, player, 100, 200); 
    skeleton_vector.push_back(skeleton1); 
    Skeleton skeleton2 = Skeleton(window, player, 1500 - 32, 200); 
    skeleton_vector.push_back(skeleton2);
    

    Lösung 1:

    Skeleton skeleton1(window, player, 100, 200); 
    skeleton_vector.push_back(skeleton1); 
    Skeleton skeleton2(window, player, 1500 - 32, 200); 
    skeleton_vector.push_back(skeleton2);
    

    Worin meinst du besteht da eine Lösung oder überhaupt ein Unterschied?





  • Ach ein Denkfehler ... ich hätte es kurz testen sollen.
    Ich dachte das zuweisen bringt der Fehler ...

    Unterschied ist der, dass das Objekt erst instantiiert wird und dann anschließen kopiert wird. Vermutlich optimiert das allerdings der Compiler weg (oder!?).

    Ich meine folgendes:
    Skeleton s = Skeleton(...);
    ... wird langsamer sein als ...
    Sekeleton s(...);



  • nebler schrieb:

    Ich meine folgendes:
    Skeleton s = Skeleton(...);
    ... wird langsamer sein als ...
    Sekeleton s(...);

    Nein das ist beides identisch. In beiden Fällen wird der normale Konstruktor aufgerufen und nichts kopiert. Hier wird tatsächlich etwas kopiert (oder zumindest der Zuweisungsoperator benötigt):

    Skeleton s;
    s = Skeleton(...);
    

Anmelden zum Antworten