Zum Inhalt springen

Auf geerbte elemente einer klasse zugreifen


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben


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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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'

Geschrieben

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;

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

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...