Versuche OOP zu lernen // wahrscheinlich kleiner Anfängerfehler
-
Hallöchen,
ich fange bald ein Informatikstudium an und da hab ich mir gedacht, ich sollte mir vielleicht mal die objektorientierte Programmierung aneignen (oder es zumindest probieren). Ich hab also im Internet eine "Anleitung" dazu gefunden, die ich jetzt mal durcharbeiten werde (bis jetzt gefällt diese mir sehr gut
).
Ich hab natürlich auch das ein oder andere Skript versucht umzusetzen aber hier komme ich nicht weiter. Ich schätze da fehlt irgendwo die ein oder andere Zeile, die Ihr mir aber sicher schnell nennen könnt, denke ich
#include <string> #include <iostream> using namespace std; enum Bewegung {STEHT, STARTET, FLIEGT, LANDET, HYPERRAUM}; enum Funktion {VOLL, ANGESCHOSSEN, DEFEKT, ZERSTOERT}; class Raumfahrzeug { private: string bezeichnung, herkunft; float hoehe; unsigned long hoechstgeschw, geschw; Bewegung zustand; Funktion grad; public: Raumfahrzeug(); ~Raumfahrzeug(); void starten(); void landen(); bool setGeschwindigkeit(unsigned long _tempo); unsigned long getGeschwindigkeit(); void andocken(Raumfahrzeug _anderes); }; int main(void) { Raumfahrzeug ufo; Raumfahrzeug shuttle; ufo.setGeschwindigkeit(10000); cout << "Ufo fliegt" << ufo.getGeschwindigkeit() << "km/s" <<endl; //shuttle.andocken(ufo); return 0; } unsigned long Raumfahrzeug::getGeschwindigkeit() { return geschw; } bool Raumfahrzeug::setGeschwindigkeit(unsigned long _tempo) { if (_tempo > hoechstgeschw) return false; geschw = _tempo; return true; }Vielen Dank
DFPWare
Edit: Fehlerausgabe:
1>------ Erstellen gestartet: Projekt: KlassenObjekte, Konfiguration: Debug Win32 ------
1> Oberklasse.cpp
1> LINK : c:\users\flo\documents\visual studio 2010\Projects\KlassenObjekte\Debug\KlassenObjekte.exe wurde nicht gefunden oder beim letzten inkrementellen Linkvorgang nicht erstellt; vollständiger Link wird durchgeführt.
1>Oberklasse.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Raumfahrzeug::~Raumfahrzeug(void)" (??1Raumfahrzeug@@QAE@XZ)" in Funktion "_main".
1>Oberklasse.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Raumfahrzeug::Raumfahrzeug(void)" (??0Raumfahrzeug@@QAE@XZ)" in Funktion "_main".
1>c:\users\flo\documents\visual studio 2010\Projects\KlassenObjekte\Debug\KlassenObjekte.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Du hast Konstruktor und Destruktor nicht implementiert, deshalb beschwert sich der Linker über nicht aufgelöste Symbole.
-
Hallo
Ja sowas in der Art hab ich mir schon gedacht aber wie genau sieht das dann in der Praxis aus? Das konnte ich aus der Anleitung noch nicht entnehmen...
Danke
DFPWare
-
Dann wirf die "Anleitung" weg. Besorg dir ein vernünftiges Buch.
-
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