2 Fragen zu Anfängercode



  • Hi, Problem beim Klasse Werft Konstruktor kann nicht mit new speicher reservieren, warum? Und warum klappt es nicht, in der initialisierungsliste statt "name", "datraumschiff" einzugeben? Auf seite 356 im buch c++ für spielegrogr.. klappt das

    #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 << "Werft hat an der Werft " << name << " angedockt." << endl;
    	}
    
    	private: 
    	string name;
    };
    
    class werft {
    
    	public:
    
    	werft(string nname):
        name ("Tomek")
    	{
    		name = nname;
    		cout << "Werft wurde erstellt." << endl;	
    		datraumschiff = new raumschiff;
    		datraumschiff->andocken (this);	
    	}
    	~werft();
    	void zeigedaten () {
    		cout << this->name << endl;
    		cout << datraumschiff->name << endl;
    	}
    
    	private:
    
    	string name;
    	raumschiff *datraumschiff;
    };
    
    int main () {
    
    	werft("Scheiss Werft");
    
    	return 0;
    }
    


  • Dein Raumschiffkonstruktor will einen Parameter haben.
    Also nicht:

    datraumschiff = new raumschiff;
    

    sondern:

    datraumschiff = new raumschiff("Raumschiffname");
    

    Sagt Dir Dein Compiler das nicht?



  • und an deinen privaten Name kommst du so auch nicht drann

    sollte aber wirklich alles genau so der Kompiler melden



  • Mein compiler sagt "no matching function for call to ..." benutze c4droid aufm handy. habe die Sachen jetzt behoben aber es besteht noch ein problem in der daruntergelegenen zeile mit der function andocken (this). Eigentlich genau so dausgeführt wie im buch seite 363 zeile 81



  • dlmr schrieb:

    es besteht noch ein problem

    Was ist an Copy&Paste so schwer?

    Wie sieht der Code jetzt aus?



  • this ist ein Pointer auf das aktuelle Objekt, in andocken erwartest du aber eine Referenz auf werft. Du musst also entweder *this schreiben oder die Signatur von andocken ändern.



  • 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;
    }
    


  • 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


Log in to reply