Verständnisproblem Klassen in C++
-
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.