Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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 Zeile
Bruecke.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

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...


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.

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

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.

bin dabei. hatte den post getippt während du geantwortet hattest.

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'

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;

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 von flashpixx

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!

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.