Objekt kann nicht erstellt werden. Syntaxfehler?
-
Hallo zusammen, ich schreibe grad ein kleines Sparschwein Programm in Objektorientierten C++
Hier erstmal der Header mit der Klasse (Header.h):# include <iostream> using namespace std; #ifndef _PiggyBank_ #define _PiggyBank_ class PiggyBank{ private: short EinCent; short ZehnCent; short FunfzigCent; short EinEuro; short Voll; bool kaput; public: PiggyBank(int g){ EinCent=0; ZehnCent=0; FunfzigCent=0; EinEuro=0; Voll=g; kaput=false; } ~PiggyBank(); inline bool isEmpty(){ if (EinCent==0 && ZehnCent==0 && FunfzigCent==0 && EinEuro==0) return true; else return false; } inline bool isFull(){ if (EinCent+ZehnCent+FunfzigCent+EinEuro==Voll) return true; else return false; } inline bool isBroken(){ if (kaput=false) return true; else return false; } short add1Cents(); short add10Cents(); short add50Cents(); short add1Euro(); short breakInto(); }; #endifSowie die Methoden dif. die nicht inline erfolgt sind (Methoden.cpp):
# include "Header.h" short PiggyBank::add1Cents(){ short temp; cout <<"Wie viele 1 Centstücke sollen eingeworfen werden?" <<endl; cin >> temp; EinCent=temp; if (isFull()==false) return 0; else return ((EinCent+ZehnCent+FunfzigCent+EinEuro)-Voll); } short PiggyBank::add10Cents(){ short temp; cout <<"Wie viele 10 Centstücke sollen eingeworfen werden?" <<endl; cin >> temp; ZehnCent=temp; if (isFull()==false) return 0; else return ((EinCent+ZehnCent+FunfzigCent+EinEuro)-Voll); } short PiggyBank::add50Cents(){ short temp; cout <<"Wie viele 50 Centstücke sollen eingeworfen werden?" <<endl; cin >> temp; FunfzigCent=temp; if (isFull()==false) return 0; else return ((EinCent+ZehnCent+FunfzigCent+EinEuro)-Voll); } short PiggyBank::add1Euro(){ short temp; cout <<"Wie viele 1 Eurostücke sollen eingeworfen werden?" <<endl; cin >> temp; EinEuro=temp; if (isFull()==false) return 0; else return ((EinCent+ZehnCent+FunfzigCent+EinEuro)-Voll); } short PiggyBank::breakInto(){ return EinCent+(10*ZehnCent)+(50*FunfzigCent)+(100*EinEuro); kaput = true; EinCent=0; ZehnCent=0; FunfzigCent=0; EinEuro=0; }und zu guter letzt mein Versuch ein Objekt der Klasse zu erstellen:
# include "Header.h" void main(){ PiggyBank Pig(500); }An dieser Stelle bekomme ich zwei Kompiliererfehler:
"error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall PiggyBank::~PiggyBank(void)" (??1PiggyBank@@QAE@XZ)" in Funktion "_main"."
und:
"fatal error LNK1120: 1 nicht aufgelöste externe Verweise."Ich habe eigentlich alles streng nach Lerhbuch gemacht und trotzdem kann ich an dieser Stelle keine Klasse erzeugen! Wo ist dieser blöde Fehler nur, ich sehe ihn nach einer Stunde suche immer noch nicht

Grüße Blade
-
Du deklarierst in Header.h den Destruktor ~PiggyBank(), aber du definierst ihn nirgendwo. Da du anscheinend keinen speziellen Destruktor benötigst, kannst du die Deklaration einfach streichen und der Compiler wird sich einen Standarddestruktor zusammenstricken.
Außerdem noch zwei Anmerkungen:
- main gibt int zurück, nicht void. Manche Compiler fressen das trotzdem, aber das kann ungünstige Folgen haben, wenn man das macht.
- Niemals using namespace in Headern verwenden. Du verseuchst damit den globalen Namensraum für alle die den Header verwenden. Vor allem, da du in Header.h keinen einzigen Bezeichner aus dem Namensraum std oder der Bibliothek iostream verwendest. Du benutzt sie ja erst in Methoden.cpp. Daher solltest du iostream nur in Methoden.cpp inkludieren. In cpp Dateien ist es auch ok, using namespace zu verwenden, da man diese nirgendwo sonst einbindet.
-
Die beiden Fehler sind nur einer. Du hast den Destruktor nicht definiert. Kuckstu:
"error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall PiggyBank::~PiggyBank(void)" (??1PiggyBank@@QAE@XZ)" in Funktion "_main"."
Stefan.
-
Danke für die schnelle Hilfe, ich habe in der Headerdatei einfach hinterm destruktor die beiden geschweiften Klammern gemacht und fertig.
Ein wirklich blöder Fehler!Ich habe mir zwar schon gedacht das das was mit dem destruktor zutun hatte (der kamm ja in der Fehlermeldung vor, ich hab mir diesen Teil auch mehrfach angesehen, habe aber nicht bemerkt das der nicht def. war....
für Tip 1: Bin ich dankbar, habe nie verstanden warum die main manchmal mit int und return 0 geschrieben wurde.
für Tip 2: Frag meinen Übungsleiter, ich glaub ich hab bei jeden Programm das ich hier reingeschrieben habe diesen Kommentar bekommen:)
Namensbereiche sind für mich das ich am Anfang jeden Programmes using namespace std; schreibe ^^, mehr weiß ich nicht, mehr gibts need ^^
Bitte nicht lünchen
Grüße Blade
-
blade1982 schrieb:
für Tip 1: Bin ich dankbar, habe nie verstanden warum die main manchmal mit int und return 0 geschrieben wurde.
Der "tiefere" Sinn dahinter ist übrigens, dass die meisten Betriebssysteme (zumindest alle die mir einfallen) erwarten, dass ein Programm einen Fehlercode vom Typ int zurückgibt mit Null für "kein Fehler" und ungleich Null für "Fehler". Ein Compiler der void main() kompilert wird hoffentlich einfach ein Programm daraus machen, das immer 0 zurück gibt, ansonsten würde ja auf uninitialisierten Speicher zurückgegriffen und da wird nur selten der Wert 0 stehen. Von daher ist void main() sicher nicht direkt "schlimm", jedoch ist es nicht der C++ Standard und ein etwas standardkonformerer Compiler wie der GCC nimmt sowas gar nicht erst an.
Ich hätte nie gedacht, dass ich jemals den GCC als Beispiel für einen standardkonformen Compiler nehmen würde
