static und vererbung



  • Hi,
    ich habe eine Klasse "Einheit" mit static const int maxHP und möchte nun Kindklassen ableiten, die auch jeweils eine static const int maxHP haben, mit unterschiedlichen Werten für jede abgeleitete Klasse.

    Nach vielem Foren durchsuchen weiß ich jetzt, dass das nicht so einfach geht und man könne "Einheit" mit virtual int getMaxHP() austatten und die Funktion in den abgeleitetet Klassen überschreiben. Allerdings müsste ich dann jede Kindklasse mit einer eigenen Variable und einer eigenen getMaxHP-Funktion austatten. Das klingt nicht sehr elegant, da es prinzipell immer die gleiche Funktion und die gleiche Variable ist. Geht das nicht irgendwie einfacher?

    Danke!
    Martin



  • Ja, laß die Variable weg.



  • Da bietet sich doch virtual an. Und du brauchst die Variable auch nur 1x, und lässt sie vererben.

    Hier mal ein kleines Bsp.:

    class Einheit
    {
        protected:
            const int max_hp;
    
        public:
            Einheit(int i) : max_hp(i) {}
            virtual int maxHp() // Das const kannst du dir bei primitiven Typen sparen, da sowieso r-value.
            {
                return max_hp;
            }
    };
    
    class Foo : public Einheit
    {
        public:
            Foo(int i) : Einheit(i) {}
            virtual int maxHp()
            {
                return max_hp;
            }
    };
    
    int main()
    {
        Einheit e(10);
        Foo f(50);
    
        Einheit* p = &e;
        cout << p->maxHp(); // max. HP ist 10.
    
        p=&f;
        cout << p->maxHp(); // max. HP ist 50.
    }
    

    edit: Wäre für deine Zwecke nicht sogar eine abstrakte Basisklasse sinnvoll?



  • Ich verstand das so:

    class Einheit
    {
        public:
            virtual int maxHp() =0 ;
    };
    
    class Hoplit : public Einheit
    {
        public:
            virtual int maxHp()
            {
                return 17;
            }
    };
    
    int main()
    {
        Einheit e;//geht ja gar nicht
        Hoplit h;
    
        Einheit* p;
        p=&h;
        cout << p->maxHp(); // max. HP ist 17.
    }
    


  • Ich habe es auch so verstanden wie volkard. Das würde sich auch mit virtuellen Funktionen schwierig gestalten, da Konstruktoren sich nun mal nicht polymorph verhalten.
    Daher klare Lösung: Virtuelle Basisklasse + MaxHp wird im Konstruktor der erbenden Klassen festgelegt.



  • @Gugelmoser: Danke für die Antwort, aber so hab ich das nicht gemeint. Ich möchte nicht im Konstruktor die maxHP festlegen, sondern sie static const haben.

    @volkard: Ja, so sollte es funktionieren. Aber dann bräuchte halt jede Kindklasse diese Funktion oder? Da ich später viele solcher Werte habe, wäre es eben gut, wenn man einfach eine static Variable für jeder Kindklasse hätte. Aber das geht demnach nicht oder?
    edit: Zugegeben, viel Arbeit ist deine Methode nicht.^^

    @cooky451:

    MaxHp wird im Konstruktor der erbenden Klassen festgelegt.

    Dann würde jede einzelne Instanz einer Klasse den selben Wert speichern oder wie meinst du das?

    Danke für die Antworten



  • Knobbers schrieb:

    wie meinst du das?

    So:

    class Einheit
    {
      unsigned max_hp_;
    public:
      Einheit(unsigned max_hp)
        : max_hp_(max_hp)
      {}
      virtual ~Einheit() = 0
      {}
    };
    
    class Hoplit : public Einheit
    {
    public:
      Hoplit()
        : Einheit(17)
      {}
    };
    


  • @cooky: Aber ich brauch doch nicht für jede Instanz die selbe Variable nochmal speichern!?



  • Knobbers schrieb:

    edit: Zugegeben, viel Arbeit ist deine Methode nicht.^^

    👍



  • Knobbers schrieb:

    @cooky: Aber ich brauch doch nicht für jede Instanz die selbe Variable nochmal speichern!?

    Du könntest das variabel machen:

    //...
    
    class Hoplit : public Einheit
    {
    public:
      Hoplit(unsigned init_hp)
        : Einheit(init_hp)
      {}
    }; 
    
    int main()
    {
        Hoplit first(17)
        //...
    }
    

    Oder wie meinst du das mit "nochmal"?



  • Oder wie meinst du das mit "nochmal"?

    Ich brauch maxHP nicht variabel, ich brauche es static. Nicht jede Hoplitinstanz muss speichern was die max. HP sind. Das reicht einmal. Auch wenns natürlich funktioniert, wenn es jede Instanz speichert.



  • Knobbers schrieb:

    @cooky: Aber ich brauch doch nicht für jede Instanz die selbe Variable nochmal speichern!?

    Doch. Also nein, aber Speicher in dieser Größenordnung interessiert eh niemanden. Wenn du sicher bist, dass der Wert sich nicht ändert, kannste die Variable noch const machen.
    Die Alternative hat volkard ja schon gezeigt, aber das war doch quasi das, was du oben beschrieben hast.
    Allerdings scheint es mir im Kontext der Aufgabe sinnvoller, die Variable variabel zu halten. Stell dir nur mal vor, ein Hoblit wird gebufft/gedebufft. Dann könnte der Wert sich für ein einzelnes Objekt ändern.



  • Das hätte ich dann mit einer eigenen Variable gemacht. Wenn der Hoplit debufft, dann muss er ja wieder wissen, was die "Standard max hp" für Hopliten sind.

    Also Volkards Idee ist glaub ich echt das was ich brauch. Vielen Dank euch allen.



  • Knobbers schrieb:

    Das hätte ich dann mit einer eigenen Variable gemacht. Wenn der Hoplit debufft, dann muss er ja wieder wissen, was die "Standard max hp" für Hopliten sind.

    Das musst du eh der Buf Klasse entnehmen, stell dir nur mal zwei zeitlich überlappende Bufs vor. 😃



  • cooky451 schrieb:

    Allerdings scheint es mir im Kontext der Aufgabe sinnvoller, die Variable variabel zu halten. Stell dir nur mal vor, ein Hoblit wird gebufft/gedebufft. Dann könnte der Wert sich für ein einzelnes Objekt ändern.

    Auch gefährlich. Durch den Buff bekommt er 100% dazu, macht aus 17 jetzt 34. Dann steigt er ein Level auf und bekommt 10 dazu, jetzt hat er 44. Buff verfliegt, er hat 22. Könnte sein, daß man sich damit in Teufels Küche bringt, und lieber immer

    int Einheit::getMaxHp(){
       return hpModifier*getUnmodifiedMaxHp();
    }
    

    und
    getUnmodifiedMaxHp() ist die virtuelle.



  • Ja eigentlich weiß ich gar nicht so genau was ich tue 😃
    Wer weiß ob ich überhaupt je zu den Buffs komm... Mein ganzes Programm is eh ich nicht sehr professionell gestaltet (wie man vllt gemerkt hat^^).



  • Knobbers schrieb:

    Ja eigentlich weiß ich gar nicht so genau was ich tue 😃
    Wer weiß ob ich überhaupt je zu den Buffs komm... Mein ganzes Programm is eh ich nicht sehr professionell gestaltet (wie man vllt gemerkt hat^^).

    Dann fang vielleicht mit einem kleinen Problem (Kann auch ein kleines Teilproblem deines Spiels sein) an, und lerne daran und mit einer Handvoll guten Büchern, wie man sowas ordentlich(er) gestaltet. In den FAQ gibts ne Menge Buchvorschläge 🙂


Log in to reply