Problem mit Vorwärtsdeklaration
-
Hey Leute habe folgenden Code:
classGegner.h
#ifndef CLASSGEGNER_H_INCLUDED #define CLASSGEGNER_H_INCLUDED #include <string> class Gegner { public: Gegner( std::string name, int gesundheit, int ruestung, int schnelligkeit ); ~Gegner(); std::string getName() const { return itsName; } void setName( std::string name ); int getGesundheit() const { return itsGesundheit; } void setGesundheit( int gesundheit ); int getRuestung() const { return itsRuestung; } void setRuestung( int ruestung ); int getSchnelligkeit() const { return itsSchnelligkeit; ) void setSchnelligkeit( int schnelligkeit ); private: std::string itsName; int itsGesundheit; int itsRuestung; int itsSchnelligkeit; }; class StaerkeGegner : public Gegner { public: StaerkeGegner( std::string name, int gesundheit, int ruestung, int schnelligkeit, int staerke ); ~StaerkeGegner(); int getStaerke() const { return itsStaerke; } void setStaerke( int staerke ); private: int itsStaerke; }; class ZauberGegner : public Gegner { public: ZauberGegner( std::string name, int gesundheit, int ruestung, int schnelligkeit, int zauberfaehigkeit ); ~ZauberGegner(); int getZauberfaehigkeit() const { return itsZauberfaehigkeit; } void setZauberfaehigkeit( int zauberfaehigkeit ); private: int itsZauberfaehigkeit; }; #endif // CLASSGEGNER_H_INCLUDEDclassGegner.cpp
#include "classGegner.h" #include <string> using namespace std; Gegner::Gegner( string name, int gesundheit, int ruestung, int schnelligkeit ): itsName( name ), itsGesundheit( gesundheit ), itsRuestung( ruestung), itsSchnelligkeit( schnelligkeit ) { } Gegner::~Gegner() { } void Gegner::setName( string name ) { itsName = name; } void Gegner::setGesundheit( int gesundheit ) { itsGesundheit = gesundheit; } void Gegner::setRuestung( int ruestung ) { itsRuestung = ruestung; } void Gegner::setSchnelligkeit( int schnelligkeit ) { itsSchnelligkeit = schnelligkeit; } StaerkeGegner::StaerkeGegner( string name, int gesundheit, int ruestung, int schnelligkeit, int staerke ): itsStaerke( staerke ) { Gegner( name, gesundheit, ruestung, schnelligkeit ); } StaerkeGegner::~StaerkeGegner() { } void StaerkeGegner::setStaerke( int staerke ) { itsStaerke = staerke; } ZauberGegner::ZauberGegner( string name, int gesundheit, int ruestung, int schnelligkeit, int zauberfaehigkeit ): itsZauberfaehigkeit( zauberfaehigkeit ) { Gegner( name, gesundheit, ruestung, schnelligkeit ); } ZauberGegner::~ZauberGegner() { } void ZauberGegner::setZauberfaehigkeit( int zauberfaehigkeit ) { itsZauberfaehigkeit = zauberfaehigkeit; }Ich bekomme sehr viele Fehlermeldungen, ich denke jedoch, die beiden an denen es liegt sind diese hier:
classGegner.h Zeile 28 invalid use of undefined typ gegner
classGegner.h" Zeile 7 forward declaration of type class gegner
classGegner.h" Zeile 40 invalid use of type class gegnerdie anderen fehlermeldungen beziehen sich auf die .cpp datei und hängen vermute ich mit den fehlern zusammen.
Ich kapiere es jedoch nicht, denn ich deklariere ja gegner bevor ich die davon abgeleiteten klassen deklariere.
Hoffe ihr könnt mir wieder einmal Helfen=)
Danke schonmal
Gruß fr33G
-
In Zeile 17, hast du eine runde Klammer zu gemacht, da muss aber eine geschweifte Klammer zu hin. Sehr unglückliche Fehlermeldung, die der Compiler da raus macht. Mit der richtigen Klammerung funktioniert alles, zumindest in der Header-Datei, die cpp habe ich jetzt nicht getestet.
-
Mach mal in Gegner den Destruktor virtual.
Und in der .cppStaerkeGegner::StaerkeGegner( string name, int gesundheit, int ruestung, int schnelligkeit, int staerke ): itsStaerke( staerke ) { Gegner( name, gesundheit, ruestung, schnelligkeit ); }sollte doch eher
StaerkeGegner::StaerkeGegner( string name, int gesundheit, int ruestung, int schnelligkeit, int staerke ): Gegner( name, gesundheit, ruestung, schnelligkeit ), itsStaerke( staerke ) { }heißen, oder? (Basisinitialisierung)
-
Hey Danke an euch beide für die schnelle und sehr hilfreichen Antworten.
Hab beides geändert, uns nun läufts=)
Vielen Dank
-
Soo Leute, hätte doch nochmal ne Frage, passt zwar net direkt unter den Threadnamen, aber da hier schon die Quelldatein sind post ichs grad hier zu.
Kann ich irgendwie im Programm abfragen ob ein Zeiger
Gegner* myGegnerein Zeiger auf ein
ZauberGegner
oder auf ein StaerkeGegner ist?also so auf die art
if( myGegner == ZauberGegner* ) //do something elsle if( myGegner == StaerkeGegner* ) // do somethingDanke schonmal=)
-
Das geht zwar auch, aber das Stichwort das du suchst ist Polymorphie. Damit geht das nochmal ein ganzes Stück eleganter als das was du vor hast. Schlag das mal in deinem Lehrbuch/Google nach.
-
dynamic_cast

-
Wenn so etwas notwendig ist, stimmt was am Design nicht

Ich nehme an, du willst mit dem Gegner interagieren. Z.B. soll dir der Gegner Schaden zufügen.
Dann gib Gegner ne Virtuelle Methode, die du aufrufst.
Z.B. sowas:class Player { }; class Gegner { virtual void damagePlayer( Player* )=0; } class RitterGegner : public Gegner { void damagePlayer( Player *p ) { p->chopHead(); } }; class ZauberGegner : public Gegner { void damagePlayer( Player* p ) { randomWizTransform(p); } };Ich hoffe es ist klar worauf ich hinaus will

-
dynamic_cast<> schrieb:
dynamic_cast

Was oberträge ist und die Abfrage des return nach Hinzufügen einer neuen Klasse erweitert werden muss. Dann am besten noch in ner falschen Reihenfolge (Basisklasse vor abgeleiteter Klasse), und schon ist die Kacke am Dampfen.
-
Ok, danke schön.
Weiß grad auch net wieso ich so umständlich gedacht habe...
Ich habe ja mittlerweile die Klasse auch schon bissel geändert gehabt mit virtuellen Methoden.
Aber mein Problem wollt ich wohl wieder mal zu umständlich lösen;-)Auf jeden Fall mal danke=)
Und ja ich weiß wo du drauf hinaus willst
