Versuche OOP zu lernen // wahrscheinlich kleiner Anfängerfehler
-
Hallo
Hab mir das ganze jetzt nochmal angeschaut und so wie ich das verstanden haben werden Konstruktor und Destruktor für Raumfahrzeug in Zeile 19 bzw 20 implementiert.
Gruß
DFPWare
-
Nein, dort werden die deklariert. In Zeile 23 wird bspw. setGeschwindigkeit deklariert, die Definition (Implementation) steht dann in Zeile 44-52. Für andere Funktionen fehlt das bei dir.
Im Prinzip definiert man Konstruktor und Destruktor genauso wie normale Funktionen, aber dazu kommt noch die Initialisiererliste und die Überlegung, ob man einen Destruktor unbedingt braucht, Kopierkonstruktor usw. Das ist ein bisschen viel für eine Antwort in einem Forum.
-
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 DestruktorNachtrag. 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 BedeutungDefinition: 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