<<valle>> Geschrieben 3. September 2011 Geschrieben 3. September 2011 Hallo liebe Fachinformatiker, ich bin gerade dabei ein kleines Spiel zu programmieren und dabei stoße ich auf einen Fehler, den ich nicht verstehe. Villt könnt ihr mir ja weiter helfen. Ich habe zwei Klassen: class Obj { public: string typ; char figur; int x; int y; Obj() { x=-1; y=-1; typ=""; figur=' '; } }; und eine zweite Klasse: class item : public Obj { public: int kosten; BOOL visible; item(int k, BOOL v) : Obj() { kosten=k; visible=v; } }; Soweit so gut. Jetzt bilde ich eine Instanz der Klasse item. class item Brücke(3,false); Alles kein Problem aber wenn ich jetzt auf die Elemente zugreifen möchte: Brücke.x=1; Gibt mir mein Kompiler (Visual Studio 2008 Express) folgenden Fehler: error C2143: Syntaxfehler: Es fehlt ';' vor '.' error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. error C2371: 'Brücke': Neudefinition; unterschiedliche Basistypen Kann mir jemand weiter helfen? Vielen Dank im voraus! Lg Zitieren
flashpixx Geschrieben 3. September 2011 Geschrieben 3. September 2011 Also soweit ich das sehe ist der Code: class item Brücke(3,false); syntaktisch nach C++ nicht korrekt. Außerdem würde ich davon abraten Sonderzeichen in den Bezeichnern zu verwenden. Im Normalfall würde man via item bruecke(3,false); das Objekt instanziieren Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 Hey danke für die Antwort. Das was du mir rätst hab ich auch schon ausprobiert: item Bruecke(3,false,'='); Bruecke.x=1; liefert den selben Fehler. Ich habs auch schon mit nem pointer versucht... item *Bruecke=new item(3,false,'='); Bruecke.x=1; Bringt leider alles nichts. Es gibt keinen Fehler wenn ich die ZeileBruecke.x=1; weg lasse. also nur: item Bruecke(3,false,'='); bzw. item *Bruecke=new item(3,false,'='); Dann funktioniert es, aber warum kann ich auf die Elemente nicht zugreifen? Wär dankbar für weitere Ideen. Lg Zitieren
Joey P Geschrieben 3. September 2011 Geschrieben 3. September 2011 also mein c++ ist etwas eingerostet, aber in java würde ich die elemente nicht public machen sondern private und ich würde get und set Methoden erstellen also: public int getX(){ return x; } public void setX(int x){ //Korrektheit von x überprüfen this.x = x; } und das selbe auch für die anderen Elemente... Zitieren
flashpixx Geschrieben 3. September 2011 Geschrieben 3. September 2011 item Bruecke(3,false,'='); Bruecke.x=1; Deine Klasse item hat keinen Konstruktor mit 3 Parametern, sondern nur mit 2. Weiterhin solltest Du die Initialisierung der Properties der Klasse nicht innerhalb des Konstruktors vornehmen, sondern es wird zwischen der Konstruktor und dem Methodenrumpf initialisiert: myclass::myclass( int param1, bool param2) : prop1(param1), prop2(param2) {} Ob Du nun einen Pointer auf ein Objekt vom Heap erzeugst oder es innerhalb des Stacks ablegst, ist unerheblich für den Fehler, in beiden Fällen wird als erstes der Konstruktor aufgerufen. Der Unterschied ist beim Heap relevant, dass Du Dich selbst um die Zerstörung des Objektes kümmern musst. Weiterhin wird der Datentyp Boolean nicht "BOOL", sondern "bool" geschrieben, auf korrekte Syntax musst Du schon achten. Da Du den Datentyp "string" verwendest und keinen Namespace angegeben hast, würde ich darauf tippen, dass Du innerhalb des Headers ein "using std;" stehen hast, was man nicht machen soll, denn damit überschreibst Du ggf Namespaces. Using-Direktiven gehören nur in das Hauptprogramm und nicht in eine Klasse. Du solltest erst einmal dafür sorgen, dass Du einen vollständigen und syntaktisch richtigen Klassenaufbau hast. Ich empfehle als Literatur Highscore - Programmieren in C++: Aufbau - Klassen und Objekte Aufgrund der Bruchstücke an Quellcode kann man die Probleme so nur schwierig nachvollziehen bzw. wie bei der Anzahl der Parameter der Konstruktoren ist Deine Beschreibung so nicht konsistent. Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 Danke, aber das funktioniert leider auch nicht... ich habs so gemacht: Die Klasse: class item : public Obj { private: int kosten; BOOL visible; public: item(int k, BOOL v,char f) : Obj() { kosten=k; visible=v; x=-1; y=-1; figur=f; typ="item"; } void setkosten(int k) { kosten=k; } }; Und so wie du sagst: item Bruecke(3,false,'='); Bruecke.setkosten(3); hat als Ergebnis den selben Fehler: error C2143: Syntaxfehler: Es fehlt ';' vor '.' error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. error C2371: 'Bruecke': Neudefinition; unterschiedliche Basistypen Siehe Deklaration von 'Bruecke' Ich weiß echt nicht weiter. Ich habs nochmal im Kompendium C/C++ von Dirk Louis nachgeguckt. Da stehts so wie ichs im ersten Post hatte: class item variable; variable.x=1; Hat jemand noch ne Idee? Danke lg Zitieren
flashpixx Geschrieben 3. September 2011 Geschrieben 3. September 2011 Lies einmal bitte, das was ich schreibe und setze es auch um ! Es gibt keinen Typ BOOL (siehe Fundamental types - Cppreference ), der Typ heißt "bool", Du musst auch korrekten Syntax (korrekte Schreibweise) achten. Außerdem habe ich auch schon geschrieben, dass Du keine Sonderzeichen bei Variablennamen / Methodennamen verwenden solltest. Weiterhin wird eine Instanz der Klasse nicht mit dem Schlüsselwort "class" eingeleitet, wie Du es wieder machst. Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 bin dabei. hatte den post getippt während du geantwortet hattest. Zitieren
Klotzkopp Geschrieben 3. September 2011 Geschrieben 3. September 2011 Zeig bitte ein vollständiges Minimalbeispiel, das den Fehler reproduziert. Mit hoher Wahrscheinlichkeit liegt der Fehler in einem nicht gezeigte Code-Teil oder ist durch die Code-Struktur begründet. Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 Also ich hab jetzt das 'using namespace std;' raus genommen. Den Konstruktor entfernt. keine Umlaute verwendet. bool statt BOOL. Es sieht jetzt wie folgt aus: Klasse Obj class Obj { public: std::string typ; char figur; int x; int y; }; Klasse item: class item : public Obj { public: int kosten; bool visible; }; Soo jetzt dürfte nichts mehr passieren Die Instanz: item Bruecke; Wenn man das so kompiliert kommt kein Fehler. Füge ich diese Zeile hinzu: Bruecke.x=1; kommt der Fehler error C2143: Syntaxfehler: Es fehlt ';' vor '.' error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. error C2371: 'Bruecke': Neudefinition; unterschiedliche Basistypen Siehe Deklaration von 'Bruecke' Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 Hier der vollständige Anfang des Codes:#include <iostream> #include <string> #include <fstream> #include "Windows.h" #include "Funktionen.h" #define breite 50 #define hohe 30 #define hudbreite 20 class Spieler { public: int x; int y; char figur; int leben; Spieler() { x=0; y=hohe/2; figur='X'; leben=3; } void reset() { x=0; y=hohe/2; leben=3; } }; class HUD { public: std::string status; std::string ziel; std::string level; HUD() { status=""; ziel=""; level=""; } }; class Level { public: int objectanzahl; int axtschläge; //int levelMap[breite][hohe]; Obj *object; ~Level() { delete object; } }; class inventar { public: int gold; int holz; int brücken; inventar() { gold=0; holz=0; brücken=0; } void reset() { gold=0; holz=0; brücken=0; } }; class Obj { public: std::string typ; char figur; int x; int y; }; class item : public Obj { public: int kosten; bool visible; }; //Globale Variabeln int MenuEingabe=-1; char map [breite][hohe]; char hud [hudbreite][hohe]; Spieler S; HUD H; Level *lvl = new Level[6]; inventar invent; item Bruecke; //Bruecke.x=1; Zitieren
flashpixx Geschrieben 3. September 2011 Geschrieben 3. September 2011 (bearbeitet) Der Fehler wird in Deinem Code liegen: #include <string> #include <iostream> class Obj { public: std::string typ; char figur; int x; int y; }; class item : public Obj { public: int kosten; bool visible; }; int main(int argc, char* argv[]) { item Bruecke; Bruecke.x = 5; std::cout << Bruecke.x << std::endl; return 0; } liefert mit g++ 4.2.1 keine Compilerfehler und als Ausgabe eben korrekt den Wert, der für x gesetzt wurde. Natürlich sollte man für die Klassen entsprechende Header und CPP Dateien erzeugen (ich habe das nur mal Quick 'n' Dirty ausprobiert). Klassen werden im Normalfall in einzelnen Dateien (Header & CPP) abgelegt und nicht alles in eine Datei reingehauen. Die Defineanweisungen sollten nicht verwendet werden, dafür gibt es Konstanten. Außerdem fehlt die Main Funktion in Deinem Code. Bitte lerne die Grundlage im Aufbau bei C++ Programmen Bearbeitet 3. September 2011 von flashpixx Zitieren
<<valle>> Geschrieben 3. September 2011 Autor Geschrieben 3. September 2011 Oh da liegt der Fehler! Wenn ich:Bruecke.x=1 in die main Funktion schreibe funktioniert es. Ich wusste nicht, dass das so sein muss.Ich dachte man könnte das auch außerhalb machen... Danke! Zitieren
flashpixx Geschrieben 3. September 2011 Geschrieben 3. September 2011 Ich wusste nicht, dass das so sein muss.Ich dachte man könnte das auch außerhalb machen... Dir scheinen die Grundlagen zu fehlen, diese solltest Du vielleicht erst einmal erarbeiten, bevor Du irgendein Projekt umsetzt: Highscore - Programmieren in C++: Einführung Auch, dass man alle Klassen in eine Datei schreibt, macht man nicht, sondern man trennt diese eben in Header- und CPP-Dateien auf, je nach Komplexität sollte man auch mit Namespaces arbeiten. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.