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_INCLUDED
    

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

    die 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


  • Mod

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

    StaerkeGegner::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* myGegner
    

    ein Zeiger auf ein
    ZauberGegner
    oder auf ein StaerkeGegner ist?

    also so auf die art

    if( myGegner == ZauberGegner* )
    //do something
    elsle if( myGegner == StaerkeGegner* )
    // do something
    

    Danke schonmal=)


  • Mod

    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 😉


Anmelden zum Antworten