2 Fragen zu Anfängercode



  • Es tut nun was es soll, vielen Dank. Den neuen Code poste ich gleich. Habe paar Fragen dazu dann lass ich euch mit noobalert in ruhe.Ich weiss c++ ist viel umfassender als die Fragen sind aber ich glaube es sind nur Fragmente die mir fehlen um ein ganzes Stück weiter zu kommen, also bitte beantworten.

    1. Warum zerstört sich die Instanz sofort, obwohl das Programm durch cin >> noch nicht beendet ist und wie kommt man dem entgegen?
    2. Was genau bewirkt der Stern bei der Parameterliste wo der this-zeiger verwendet wird?
    3.Wie müsste man die signatur umschreiben, um den Stern zu umgehen?

    #include <iostream>
    
    using namespace std;
    
    class werft;
    
    class raumschiff {
    
    	public:
    
    	raumschiff (string nname) {
    		cout << "Raumschiff erstellt" << endl;
    		name = nname;
    	}
    	~raumschiff() {
    		cout << "Raumschiff zerstört.";
    	}
    	void andocken (werft &kacke) {
    		cout << name << " hat an der Werft " << name << " angedockt." << endl;
    	}
    
    	string name;
    };
    
    class werft {
    
    	public:
    
    	werft(string nname):
        name ("Tomek")
    	{
    		name = nname;
    		cout << "Werft " << name << " wurde erstellt." << endl;	
    		datraumschiff = new raumschiff ("Enterscheiss");
    		datraumschiff->andocken (*this);	
    	}
    	~werft() {
    		cout << "Werft zerstört." << endl;
    	}
    	void zeigedaten () {
    		cout << this->name << endl;
    		cout << datraumschiff->name << endl;
    	}
    
    	private:
    
    	string name;
    	raumschiff *datraumschiff;
    };
    
    int main () {
    	string satz;
    
    	werft("Scheiss Werft");
    
    	cin >> satz;
    
    	return 0;
    }
    


  • Das ist ein temporäre Objekt ohne Nanen, das überlebt maximal die Anweisung, in der es erstellt wurde. Gib ihm noch einen Namen.
    Wann löscht du eigentlich das mit new erstellte Raumschiff? Warum fummelst du dort überhaupt mit new rum?



  • Lasse "new" bleiben solange du nicht damit umgehen kannst und nicht verstehst wie es funktioniert.
    Da gibt es andere, einfachere Konzepte dein Problem zu lösen.



  • New ist nicht das problem, hab delete einfach nicht gemacht, weil ich erstmal das prog zum laufen bringen wolote. Euch gehts sicher um den fehlenden code im destruktor if (x != NULL) delete x, x = NULL? ansonsten lasse ich mich gerne belehren!

    Ich verstehe die fragen 2 und 3 immernoch nicht. Im buch klappts mit dem this pointer ohne "*" und ich finde den unterschied einfach nicht.

    Dann ist noch dazugekommen, dass wenn ich den werft konstruktor ohne parameter genau den selben code wie mit parameter verpasse, mit dem einzigen unterschied, dass name ="default"; ist und ich ne instanz ohne namen erstellen will, bei folgendem main code:

    int main () {
    	string satz;
    
    	werft hallo();
    	hallo.zeigedaten(); 
    	cin >> satz;
    
    	return 0; 
    }
    

    Der Fehler: Request for member 'zeigedaten' in 'hallo' which is in of non class type 'werft()'

    Bei instanzerstellung mit namen klappt das und am fehlenden namen kanns ja nicht liegen, der ist ja "default"



  • Dlrk schrieb:

    Euch gehts sicher um den fehlenden code im destruktor if (x != NULL) delete x, x = NULL?

    Nee, denn DAS wäre typischer Opensource-Gamercoderz-Code. Wenn Du "if (x != NULL) delete x, x = NULL" nachziehen willst, wechsele vielleicht die Lernquelle. Denn "delete x" macht nicht mehr und nicht weniger.



  • Auch das x=NULL;?



  • Wozu solls gut sein? Wennst mehrmals delete auf den selben Pointer aufrufst hast einen fehler in der Programmlogik. Lass ma krachen?



  • Dlrk schrieb:

    werft hallo();
    

    Such mal nach "c++ most vexing parse" in einer Suchmaschine deines Vertrauens.
    Oder lass einfach die Klammern weg.



  • @Swordfish: Wozu muss das irgendwo zu gut sein? volkards Post ist in diesem Punkt schlicht irreführend. Da wird kein x=NULL durchgeführt.



  • Gut, aber dann frag dich doch mal andersrum: wozu soll es denn gut sein, Resourcenverwaltung und andere werftspezifische Dinge zu vermischen? Wozu überhaupt "new" und kein Smartpointer? Solange es dafür keine sinnvollen Antworten gibt, ist es doch müßig, über den Sinn von x=nullptr; hinter dem delete im Destruktor zu diskutieren.



  • danke wob 😃



  • So gesehen braucht man auch keine Smartpointer, oder überhaupt irgendwelche Zeiger, nicht wahr... werft hallo() lässt grüßen.

    Aber schon gut, ich habe verstanden, hier sind nur absolute Cracks unterwegs, denen solche Dinge natürlich völlig klar sind. Einen Anfänger irre führende Aussagen kann man sich aber auch einfach schön reden.



  • @ swordfish, ich schätze das ist nicht der selbe pointer. jede instanz hat ihre eigene adresse und nur die wird im destruktor verwendet



  • Ich bin recht neu hier zugange. Mein Eindruck ist: wer sinnvolle Fragen stellt, bekommt auch sehr fundierte Antworten.

    Wer idiotische Fragen stellt oder es auch nach mehrmaliger Aufforderung nicht schafft, die exakten Compiler-Fehlermeldungen zu posten, bekommt (zurecht!) keine sinnvollen Antworten mehr. Aber was ist daran schlimm? Warum soll dieses Forum 10000x dieselben Anfängerfragen beantworten, wenn der Verweis auf www.cplusplus.com oder ähnliche Adressen es auch tut?

    YMMV.


Anmelden zum Antworten