Verständnisproblem Klassen in C++
-
hallo nochmal,
also die folgende inventory.cpp
#include <iostream> #include "etc_item.h" void inventory::stats() { //etc_items : if (etc_items.size()==0) {cout<<"Nixdrin"<<endl;} else { for(unsigned int i=0;i<=etc_items.size()-1;i++) //search for existence of the stackable item { cout<<etc_items[i].amount<<" Einheiten der ID "<<etc_items[i].etc_item_id<<endl; }; } }in Kombination mit der folgenden inventory.h
#ifndef INVENTORY_H #define INVENTORY_H #include <vector> #include "etc_item.h" // Die Datei in der Deine Klasse etc_item enthalten ist #include "weapon.h" // Die Datei in der Deine Klasse weapon enthalten ist class inventory { public: //hier müssen die 3 vektoren für etc, armor und weapons rein. std::vector<etc_item> etc_items; //std::vector<weapon> weapons; //std::vector<armor> armors; inventory(){}; //semikolon eingefügt unsigned int weight(); //int add_armor (unsigned long itid); int add_weapon (unsigned long itid); //int has_etc has_weapon has_armor (unsigned long itid, unsigned short int how_much); //int remove_etc remove_weapon remove_armor (unsigned long itid, unsigned short int how_much); //exchangeorder (slotx, sloty) bool isfull(); void stats(); short int add_etc (unsigned long itid, unsigned short int how_much); bool has_etc(unsigned long itid, unsigned short int how_much); bool remove_etc(unsigned long itid, unsigned short int how_much); }; #endifbringt nun folgenden Fehler:
--------------------Configuration: nn - Debug-------------------- Compiling source file(s)... inventory.cpp inventory.cpp:5: error: syntax error before `::' token inventory.cpp:11: error: syntax error before `<=' token inventory.cpp:11: error: syntax error before `++' token nn.exe - 3 error(s), 0 warning(s)Der Compiler den ich benutze ist der vom MinGW developer Studio 2.05.
MinGWStudioFullSetup-2.05.exe (26,633,338)
- Files in packkage No. 1.
- MinGW Developer Studio files
- MinGW(C/C++ only) Compiler 3.4.2
- Binutils 2.15.94
- Windows32 API 3.2
- MinGW Runtime Lirbraries 3.7
- GNU Debugger(GDB) 6.0
- GNU Make 3.80.0-3
- Windows API Reference ManualIch kann natürlich den kompletten Sourcecode posten, aber ich denke keiner hat Lust in seiner Freizeit an die 1000 Codezeilen durchzulesen...
Daher hab ich versucht mich an auf die wesentlichen Stellen zu beschränken.
Also langsam beginne ich mich an den Gedanken zu gewöhnen, die Klassendefinitionen in .h Dateien auszulagern und die Methoden halt in der main.cpp zu haben.Vielleicht ist es nicht so wichtig, aber ich erwähne es doch mal explizit.
Die Klassen, die ich habe bauen aufeinander auf. Sprich es gibt eine Urklasse, von der sich alles ableitet: item.h Da ist nicht viel drin, aber etc_item.h, armor.h und weapon.h sind Tochterklassen der Art "class etc_item : public item".
Diese drei abgeleiteten benutze ich in einer neuen Klasse inventory.h ohne dass ich der inventory.h sage, dass etc_item von item abhängt. (in der etc_item.h ist natürlich die item.h inkludiert)... Vielleicht liegts ja daran?
-
In meinem Beispiel ist inventory.h in inventory.cpp eingebunden, bei Dir nicht!
Der Compiler muss doch beim Auftauchen von inventory::stats wissen dass inventory eine Klasse ist, das kann er nur dann...
-
Es geht aber um Syntaxfehler, nicht um unbekannte Klassenbezeichner.
@bololo: Ersetz mal alle "short int" durch "short". "short int" habe ich noch nie gesehen

-
5: error: syntax error before `::' token
Vor :: in dieser Zeile steht der Klassenname inventory, deshalb denke ich schon dass das darauf zurückzuführen ist dass der Header noch fehlt.
Aber was auch für typische Verwirrungsfehler sorgt, schau mal in der etc_item.h ob die Klasse korrekt mit }; abgeschlossen ist...
-
Vielleicht reagiert speziell dieser Compiler auf fehlende Bezeichner mit Syntaxfehlern, was aber bescheuert wäre.
-
Hallo,
nachdem ich nun alles was ich hab in der inventory.cpp inkludiere, bekomme ich nun andere Fehler beim compilieren. So wie ich im ersten posting geschrieben hab, funktionieren plötzlich Sachen wie cout nciht mehr, obwohl ich die iostream inkludiere...
--------------------Configuration: nn - Debug-------------------- Compiling source file(s)... inventory.cpp inventory.cpp: In member function `void inventory::stats()': inventory.cpp:14: error: `cout' undeclared (first use this function) inventory.cpp:14: error: (Each undeclared identifier is reported only once for each function it appears in.) inventory.cpp:14: error: `endl' undeclared (first use this function) nn.exe - 3 error(s), 0 warning(s)inventory.h:
#include <iostream> #include <windows.h> #include <vector> #include "item.h" #include "etc_item.h" // Die Datei in der Deine Klasse etc_item enthalten ist #include "weapon.h" // Die Datei in der Deine Klasse weapon enthalten ist #include "armor.h" #include "inventory.h" void inventory::stats() { //etc_items : if (etc_items.size()==0) {cout<<"Nixdrin"<<endl;} else { for(unsigned int i=0;i<=etc_items.size()-1;i++) //search for existence of the stackable item { cout<<etc_items[i].amount<<" Einheiten der ID "<<etc_items[i].etc_item_id<<endl; }; } }inventory.h:
#ifndef INVENTORY_H #define INVENTORY_H #include <iostream> #include <vector> #include <windows.h> #include "etc_item.h" // Die Datei in der Deine Klasse etc_item enthalten ist #include "weapon.h" // Die Datei in der Deine Klasse weapon enthalten ist #include "armor.h" #include "item.h" class inventory { public: //hier müssen die 3 vektoren für etc, armor und weapons rein. std::vector<etc_item> etc_items; std::vector<weapon> weapons; //std::vector<armor> armors; inventory(){}; unsigned int weight(); //int add_armor (unsigned long itid); short add_weapon (unsigned long itid); //int has_etc has_weapon has_armor (unsigned long itid, unsigned short how_much); //int remove_etc remove_weapon remove_armor (unsigned long itid, unsigned short how_much); //exchangeorder (slotx, sloty) bool isfull(); void stats(); short add_etc (unsigned long itid, unsigned short how_much); bool has_etc(unsigned long itid, unsigned short how_much); bool remove_etc(unsigned long itid, unsigned short how_much); }; #endifAlle Klassendefinitionen in den .h Dateien sind mit }; abgeschlossen. (vor dem #endif)
Die Tatsache, dass ich jetzt ein bischen hartnäckig versuche das auszulagern ist die, dass wenn ich es nicht jetzt am Anfang mache, mache ich es wohl nie...
Ich hoffe ihr versteht das.
Gruss
R
-
In der inventory.cpp sind die meisten Header nun unnötig, da du sie in der inventory.h bereits einbezogen hast.
*edit*
Versuch mal "std::cout << ... << std::endl;" bzw. nach den #includes: "using namespace std;".
-
Wahnsinn, es läuft!

Ein aufrichtiges Danke an alle die sich so aktiv hier beteiligt haben. 
Ihr wisst ja nicht wie sehr ich hier verzweifelt war.
Jetzt kann ich successive bibliotheken herausnehmen die ich nicht brauche.bololo77 schrieb:
Ich bin so ratlos, dass ich noch nichtmal weiß wo und über welches Thema ich nachlesen muss. (Vielleicht Namespaces?)
Hatte ja schon in diese Richtung gedacht, aber die Syntax errors haben mich mehr verwirrt als irgendwelche Namespaces.
C++ ist doch ganz anders als Delphi (welches ich bisher benutzte) und C, welches ich mal vor 10 Jahren mir mal etwas genauer anschaute.
Ich hoffe ich darf weitere Fragen auf die ich selber keine Antwort ergooglen kann weiterhin hier posten...
Super, mein Abend ist gerettet!
Gruss+Dank
Robin
-
Jetzt habe ich dann doch noch eine Frage...
Kann ich die Konstruktoren einer Klasse (die teilweise langen Sourcecode haben), deren Definition z.Z in einer .h - Datei sind in die .cpp Dateien auslagern?Meine Versuche brachten immer den Fehler:
--------------------Configuration: nn - Debug-------------------- Compiling source file(s)... main.cpp In file included from main.cpp:6: etc_item.h:15: error: function body for constructor missing main.cpp:12: error: syntax error before `namespace' main.cpp:47: error: syntax error at end of input nn.exe - 3 error(s), 0 warning(s)Oder anders gefragt, gibt es im Netz ein Tutorial, welches sich ausgiebig mit diesem Thema auseinandersetzt?
Ich bin ja lernwillig.
-
Hallo
Kann ich die Konstruktoren einer Klasse (die teilweise langen Sourcecode haben), deren Definition z.Z in einer .h - Datei sind in die .cpp Dateien auslagern?
Die Implementation mitsamt Initialisierungsliste gehört in die .cpp Datei, die Definition muß aber immer in die Headerdatei zu der Klassendefinition.
gibt es im Netz ein Tutorial, welches sich ausgiebig mit diesem Thema auseinandersetzt?
Zum Beispiel hier.
Und oben links im Menü auf dieser Seite gibts es auch noch einen Link zu mehr Tutorials.bis bald
akari
-
Hallo,
erstmal danke für deine schnelle Antwort...
leider hilft mir der Link auch nicht weiter.
Hier ist die einzige Stelle in dem Tutorial die ich finden konnte, die sich mit dem auftrennen von Sourcecode befasst:
http://tutorial.schornboeck.net/uebersetzungseinheiten.htm
Da weiss ich leider immer noch nicht wieso mein compiler den Konstruktor in der .cpp - Datei nicht "frisst".
Na, mal sehen, ob die anderen Tutorials mir weiterhelfen.
Gruss
R
-
Hallo
dann zeig doch mal den betreffenden Quellcode mit der Fehlermeldung des Compilers.
bis bald
akari
-
die komplette etc_item.h :
#ifndef ETC_ITEM_H #define ETC_ITEM_H #include "item.h" class etc_item : public item { public: long unsigned int etc_item_id; bool consumable; bool stackable; unsigned short amount; etc_item(long unsigned int itid):etc_item_id(itid); //konstruktor }; #endifdie komplette etc_item.cpp :
#include "etc_item.h" etc_item::etc_item(long unsigned int itid):etc_item_id(itid) { //constructor tradeable=true; dropable=true; quality=50; decay=100; exchangeable=true; weight=100; width=5; length=5; height=12; deconstructable=true; consumable=true; stackable=true; amount=0; }Der Fehler:
--------------------Configuration: nn - Debug-------------------- Compiling source file(s)... main.cpp In file included from main.cpp:6: etc_item.h:13: error: function body for constructor missing etc_item.h: In constructor `etc_item::etc_item(long unsigned int)': etc_item.h:13: error: syntax error before `;' token nn.exe - 2 error(s), 0 warning(s)Ich hoffe das bringt die Quelle des Fehlers ans Tageslicht...
Gruss
R
-
die initialisierungsliste ind er deklaration muss weg.
-
hmm, ich würde aber gerne die Werte beim erzeugen des Objektes im Konstruktor eintragen. Gibt es da eine Möglichkeit?
-
Hallo
du sollst ja auch nur die Initialisierungliste im Header entfernen.
In der Implementation bleibt sie drin.class etc_item : public item { public: long unsigned int etc_item_id; bool consumable; bool stackable; unsigned short amount; etc_item(long unsigned int itid); //konstruktor };bis bald
akari
-
du musst es ja nur hier wegstreichen:
class etc_item : public item { public: long unsigned int etc_item_id; bool consumable; bool stackable; unsigned short amount; etc_item(long unsigned int itid); //da muss es weg };hieran ändert sich nix
etc_item::etc_item(long unsigned int itid):etc_item_id(itid)//da is es richtig { }
-
Vielen Dank! Jetzt wird ohne Fehler compiliert und gelinkt.
Ich sehe, ich muss noch viel üben. In der Theorie habe ich es ja verstanden, alleine mir fehlt etwas Praxis.