Objekte werden gelöscht



  • @ycbm sagte in Objekte werden gelöscht:

    Wenn ich das mache ist segmentation fault

    int main () {
    	
    	vector<player>*spielerliste[2];
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                (*spielerliste)->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Wenn ich das mache kommt terminating with uncaught exception of type std::length error

    int main () {
    	
    	vector<player>*spielerliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	  		
    	system ("pause");
    }
    

    Würde mich sehr über einen Weg freuen der funktioniert )

    Warum ein Pointer auf den Vector? (das ist mir beim letzten Mal gar nicht aufgefallen)

    Versuch doch mal:

    vector<player> spielerliste;
    //.... 
    spielerliste.push_back(player(name));
    

    Und, mich würde tatsächlich jetzt auch interessieren, was du unter löschen verstehst?



  • OK, da zwei Objekte nach pause zerstört werden ist es wohl der Beweis, dass es sie doch gibt aber warum sind sie jetzt namenlos?

    #include <iostream>
    #include <string>
    #include <vector>
    
    
    using namespace std;
    
    class player {
    	
    	public:
    	
    	string name;
    	static int spielerid;
    	int id;
    	
    	player () {
    		spielerid++;
    		id = spielerid;
    		cout << "Spieler wurde erstellt" << endl << endl;
    	}
    	
    	player (string name)
    	: name (name) {
    		spielerid++;
    		id = spielerid;
    		cout << "Spieler " << name << " wurde erstellt" << endl << endl;
    	}
    	
    	player (const player& rhs) {
    		cout << "Kopierkonstruktor aufgerufen" << endl;}
    	
    	~player () {
    		cout << "Spieler " << name << " wurde vernichtet" << endl << endl;
    	}
    				
    	private:		
    };
    
    class field {
    	
    	public:
    	
    };
    
    int player::spielerid = 0;
    
    int main () {
    	vector<player>spielliste;
    	vector<player>*spielerliste = &spielliste;
    	string name;
    	
    	for (int i = 0; i < 2; i++) {
    		cout << "Name fuer Spieler " << i+1 << endl;
    		cin >> name;
                spielerliste->push_back(player(name));
        		}	 
        		cout << "Ausgabe: " << spielliste[0].name.c_str() << endl;
        		cout << "Ausgabe: " << spielliste[1].name.c_str() << endl;
        system ("pause");
    }
    


  • Dein Kopierkonstruktor kopiert nichts.



  • Ok Fehler gefunden aber verstehen tu ich's nicht..wär echt cool für ne Erklärung. Wenn ich den Kopierkonstruktor rausnehme funktioniert's..



  • @ycbm wenn du den Kopierkonstruktor raus nimmst, erstellt der Compiler einen (Google mal nach Rule of 0/3/5). Wenn du selbst einen schreibst, muss der auch kopieren.



  • I will danke



  • Kurze Fragen:
    Eine Flache Kopie, ist eine Kopie, die gemacht wurde, ohne einen copyconstructor zu programmieren. Alle Variablen der Kopie zeigen auf die Adresse des Originals? Oder ist das nur bei Zeigern der Fall?

    Tiefe Kopie wird selbstständig programmiert um neue Speicher zuzuweisen? Geht das dort nur mit new?



  • flache kopie bedeutet eigentlich, dass du nur eine referenz auf das ursprüngliche objekt erhälst, und tiefe kopie bedeutet, dass ein neues objekt mit gleichem inhalt erstellt wird.


  • Mod

    @Wade1234 sagte in Objekte werden gelöscht:

    flache kopie bedeutet eigentlich, dass du nur eine referenz auf das ursprüngliche objekt erhälst, und tiefe kopie bedeutet, dass ein neues objekt mit gleichem inhalt erstellt wird.

    Nein.



  • @ycbm sagte in Objekte werden gelöscht:

    Kurze Fragen:
    Eine Flache Kopie, ist eine Kopie, die gemacht wurde, ohne einen copyconstructor zu programmieren. Alle Variablen der Kopie zeigen auf die Adresse des Originals? Oder ist das nur bei Zeigern der Fall?

    Nur bei Zeigern. Da wird dann halt der Zeiger kopiert. Hinterher zeigen beide auf das gleiche Objekt.

    Tiefe Kopie wird selbstständig programmiert um neue Speicher zuzuweisen? Geht das dort nur mit new?

    Der erstellte Konstruktor kopiert alle Member richtig. Nur wenn du Pointer Member hast, wird halt der Pointer kopiert, wenn das zugrunde liegenden Objekt kopiert werden soll, muss man das selbst machen (das ist dann aber meistens der Fall).
    new brauchst du dafür nicht. Für Anfänger (und auch Fortgeschrittenen) gilt eigentlich, dass man new nie braucht. Die Verwendung von new ist eine absolute Ausnahme.



  • Weshalb stellt sich jeder so arg gegen new/delete? Es erscheint so nativ und handlich.



  • @ycbm weil auch Profis damit sehr schnell Fehler machen. Außerdem gibt es genug Klassen die Ressourcen Verwaltung bereit stellen und weg kapseln die durch getestet sind und korrekt arbeiten. Das kann man selbst nur schlechter machen.



  • Weitere Stichwort dazu: RAII (s. insb. "Zweites Beispiel" -> wenn innerhalb der Funktion eine Exception geworfen wird, entsteht ein Memory Leak [und dies ist ein sehr einfaches Beispiel, in komplexeren Programmen ist dies viel wahrscheinlicher!]).



  • @ycbm sagte in Objekte werden gelöscht:

    Woher ich das habe..naja wildem rumprobieren, wenn's dann zufällig klappt kann ich die Logik rekonstruieren

    Das ist so ziemlich der bescheuertste Weg C++ zu lernen 👍



  • @ycbm sagte in Objekte werden gelöscht:

    Weshalb stellt sich jeder so arg gegen new/delete? Es erscheint so nativ und handlich.

    https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-newdelete


Anmelden zum Antworten