Versuche OOP zu lernen // wahrscheinlich kleiner Anfängerfehler



  • Hallo

    ich hab das Programm mal aufs Wesentliche gekürzt und die beiden Zeilen der Deklaration einfach rausgestrichen.

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class Raumfahrzeug
    {
    	private:
    		string name;
    		int geschwindigkeit;
    
    	public:
    		bool setGeschwindigkeit(unsigned long _tempo);
    		unsigned long getGeschwindigkeit();
    };
    
    int main(void)
    {
    	Raumfahrzeug ufo;
    	Raumfahrzeug shuttle;
    
    	ufo.setGeschwindigkeit(10000);
    	cout << "Ufo fliegt" << ufo.getGeschwindigkeit() << "km/s" <<endl;
    	system("PAUSE");
    	return 0;
    }
    
    unsigned long Raumfahrzeug::getGeschwindigkeit()
    {
    	return geschwindigkeit;
    }
    
    bool Raumfahrzeug::setGeschwindigkeit(unsigned long _tempo)
    {
    	geschwindigkeit = _tempo;
    
    	return true;
    }
    

    Jetzt hab ich gar keinen Konstruktor bzw Destruktor mehr aber das Programm läuft.
    Ich sollte den Teil mit Konstruktor bzw Destruktor nochmal lesen und rausfinden wozu das alles überhaupt gut ist.

    Naja, vielen Dank

    DFPWare



  • Du hast keinen Konstruktor definiert. Du hast ihn nicht deklariert.

    Dein Code ist sin sofern schlecht weil ein frisches Raumfahrzeug eine "Zufallsgeschwindigkeit" hat. Du initialisierst den Wert nicht!

    Entweder so in der Klassendeklaration:

    Raumfahrzeug():
       : hoehe (0)
       , hoechstgeschw(0)
       , geschw(0)
       , // etc pp.
     {}
     ~Raumfahrzeug() {}
    

    Oder separat:

    Raumfahrzeug::Raumfahrzeug():
       : hoehe (0)
       , hoechstgeschw(0)
    ....
    


  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • dfpware schrieb:

    Jetzt hab ich gar keinen Konstruktor bzw Destruktor mehr aber das Programm läuft.

    Doch, die hast du. Du hast sogar noch mehr: Copy-Konstruktor und Zuweisungsoperator. Das sind nämlich Methoden, die automatisch generiert werden, wenn du sie nicht selbst definierst.



  • Hallo

    ich habe beide Versionen ausprobiert aber bei beiden bekomme ich einen Syntax Fehler wegen dem Doppelpunkt (in meinem Skript bei :name("unbekannt")).

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class Raumfahrzeug
    {
    	private:
    		string name;
    		int geschwindigkeit;
    
    	public:
    		//Raumfahrzeug();
    		//~Raumfahrzeug();
    		bool setGeschwindigkeit(unsigned long _tempo);
    		unsigned long getGeschwindigkeit();
    
    	Raumfahrzeug():
    		: name ("unbekannt")    //error C2059: Syntaxfehler: ':'
    		, geschwindigkeit(0)
    		{}
    	~Raumfahrzeug() {}
    };
    
    /*
    Raumfahrzeug::Raumfahrzeug():
    	:name ("unbekannt")
    	,geschwindigkeit(0)
    	{}
    
    Raumfahrzeug::~Raumfahrzeug() {}
    */
    
    int main(void)
    {
    	Raumfahrzeug ufo;
    	Raumfahrzeug shuttle;
    
    	ufo.setGeschwindigkeit(10000);
    	cout << "Ufo fliegt" << ufo.getGeschwindigkeit() << "km/s" <<endl;
    	system("PAUSE");
    	return 0;
    }
    
    unsigned long Raumfahrzeug::getGeschwindigkeit()
    {
    	return geschwindigkeit;
    }
    
    bool Raumfahrzeug::setGeschwindigkeit(unsigned long _tempo)
    {
    	geschwindigkeit = _tempo;
    
    	return true;
    }
    

    Danke

    DFPWare



  • schau dir doch bitte nochmal ganz genau die Syntax von Initialisierungslisten an.



  • Martin Richter schrieb:

    ...

    Es ist jeweils ein Doppelpunkt in deinen Ausführung zu viel (Entweder den Doppeltpunkt hinter der Funktion weg, oder in der neuen Zeile).

    z.B. (mit anderer Formatierung)

    Raumfahrzeug() // <-- Hier war ein Doppelpunkt zuviel
    :   hoehe(0),
        hoechstgeschw(0),
        geschw(0)
    {}
    


  • Ach, klar, da war der Doppelpunkt wohl zu viel...

    Ich hab jetzt mal alles so kommentiert wie ich das verstanden hab, könnt ihr mir sagen, ob das so hin kommt oder was falsch ist?

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class Raumfahrzeug		//Deklaration der Klasse
    {
    	private:
    		string name;
    		int geschwindigkeit;
    
    	public:
    		bool setGeschwindigkeit(unsigned long _tempo);		//Deklaration der Methode
    		unsigned long getGeschwindigkeit();					//Deklaration der Methode
    
    	//Beginn Konstruktor
    	Raumfahrzeug()
    		: name ("unbekannt")
    		, geschwindigkeit(0)
    		{}
    	~Raumfahrzeug() {}
    	//Ende Konstruktor
    };
    
    int main(void)
    {
    	Raumfahrzeug ufo;		//Aufrufen des Konstruktors
    	Raumfahrzeug shuttle;	//Aufrufen des Konstruktors
    
    	ufo.setGeschwindigkeit(10000);
    	cout << "Ufo fliegt" << ufo.getGeschwindigkeit() << "km/s" <<endl;
    	system("PAUSE");
    	return 0;
    }
    
    unsigned long Raumfahrzeug::getGeschwindigkeit()	//Definition(/Implementierung) der Methode
    {
    	return geschwindigkeit;
    }
    
    bool Raumfahrzeug::setGeschwindigkeit(unsigned long _tempo)		//Definition(/Implementierung) der Methode
    {
    	geschwindigkeit = _tempo;
    
    	return true;
    }
    

    Vielen Dank

    DFPWare



  • //Beginn Konstruktor
    Raumfahrzeug()
            : name ("unbekannt")
            , geschwindigkeit(0)
            {}
    //Ende Konstruktor
    //Beginn Destruktor
        ~Raumfahrzeug() {}
    //Ende Destruktor
    

    Nachtrag. Da war noch ein Fehler. Das am Anfang ist eine Definition einer Klasse, keine Deklaration.

    So grobe Faustregeln:
    Deklaration: Führt einen Namen in ein Programm ein und gibt dem Namen eine Bedeutung

    Definition: Deklaration ist auch Definition, wenn mehr als nur der Name eingeführt wird, z.b. Speicherplatz für Daten und Code angelegt oder innere Struktur einens Typs beschrieben wird.



  • Super, vielen Dank, das hilft mir denke ich schon ein ganzes Stück weiter.

    DFPWare


Anmelden zum Antworten