Objekte mit konstanten in Vectoren löschen



  • Moin, Hier bin ich mal wieder 🙄

    2 Fragen hätte ich.
    1. Also ich habe ein Objekt mit ein paar konstanten Variablen und wollte einige Objekte löschen. Nun bekomme ich dabei immer wieder die Fehlermeldung

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	C2280	'Player &Player::operator =(const Player &)': attempting to reference a deleted function
    

    Wenn ich die Konstanten raus nehme funktioniert alles Einwand frei, aber das ist ja auch nicht das Ziel der Sache. Hab im Internet nichts gefunden.
    Irgendwelche Lösungen ?

    2. So nun zu meiner zweiten Frage. Das ist eher eine unwichtige Frage, aber wenn ich schon dabei bin. Ich hatte in einem Konstruktor etwas umgeschrieben

    Player::Player() : leben(maxleben);
    

    zu

    Player::Player() : leben(/*maxleben*/100);
    

    Weil ich beim rumprobieren (wegen dem Fehler von meiner ersten Frage) die Konstanten rausnehmen wollte. Dann hat mein Programm gar nicht mehr funktioniert.Dann habe ich wieder leben(maxleben) hingeschrieben und es funktioniert, aber danach wieder leben(100) und es geht wieder nicht, obwohl maxleben auch den wert 100 hat. Obwohl ich nachgeguckt hab, ob maxleben irgendwo erwähnt wird (bei VS2015 unter Find all references) und nichts angezeigt wurde. Und nach einiger Zeit (die zahlen bei leben() aus Verzweiflung öfters geändert) funktioniert es einfach wieder. Ich hoffe ihr versteht überhaupt was ich meine, aber es war wirklich sehr verwirrend. Ansonsten habe ich kein Buchstaben verändert. Ist das ein Fehler vom Compiler? Ansonsten macht der ja immer ein guten Job. Aber kann ja auch meine Dummheit sein, auch wenn ich das so gar nicht verstehe.



  • Code?



  • Oh verdammt.

    Mir ist aufgefallen, das ist im falschen subforum gelandet 😡 .
    Tut mir echt leid.

    vector<vector<Player>::iterator> itvec;
    		for (auto i : player) {
    			if (i.GetDead() == true) {
    				for (auto play = player.begin(); play != player.end(); play++) {
    					if (*play == i); itvec.push_back(play);
    				}
    			}
    		}
    
    		if (itvec.size() > 0) for (auto i : itvec) player.erase(i);
    

    Und die klasse

    class Player {
    	private:
    	std::string name;
    	std::string team;
    	int kills;
    	int life;
    	int deaths;
    	bool dead;
    	int damage;
    	std::string id;
    	const int mexleben = 100;
    
    };
    
    bool operator==(Player &lp, Player &rp);
    

    Hab mal die ganzen Methoden rausgelassen, sonst würde das nur zu Lang werden



  • https://www.c-plusplus.net/forum/304133

    Klassen die const -Member halten, sind nicht kopierbar. Mach maxleben static .

    Trotzdem bitte kompletten Code, weil

    if (*play == i); itvec.push_back(play);
    

    schaut schonmal kaput aus.



  • Ja. du hast recht. Ich bin davon ausgegangen, weil alles compiled wurde, das es funktioniert. Ich hatte vergessen, das die Schleife nichtmal ausgelöst wird .Ich mach da natürlich dummen Kram der nicht funktioniert. Ich hab schon einen anderen Ansatz. Trotzdem vielen dank für die Hilfe und das nächste mal achte ich darauf den ganzen Code zu schreiben bei sowas. Wollte nur nicht ein ewig langen Code kopieren, weil mir nicht bewusst war, was relevant ist. Ich könnte natürlich noch meinen Code schreiben, aber ich denke nicht, dass es jemanden zu guten kommen würde. Es ist einfach spät und mein Kopf hat Müll produziert.

    PS. So hats nun am Ende geklappt

    for (auto play = player.begin(); play != player.end();) {	
    						if (play->GetDead()==true) play = player.erase(play);
    		}
    


  • ChukkSatyriasis schrieb:

    [...] das nächste mal achte ich darauf den ganzen Code zu schreiben bei sowas. Wollte nur nicht ein ewig langen Code kopieren, weil mir nicht bewusst war, was relevant ist. [...]

    Danke, daß du https://www.c-plusplus.net/forum/304133 gelesen hast. 🙄


Log in to reply