Problem mit Funktionen bei Vererbung



  • Hi,

    hab eine Frage zu Vererbung, zu der ich weder in meinem Buch noch hier im Forum eine eindeutige Lösung gefunden hätte:
    Ich habe eine Klasse Charakter, mit den Methoden SetMana und SetLife. Jetzt soll es davon zwei Unterklassen Fighter und Sorcer geben. Allerdings soll nur Sorcer die Methode SetMana haben. In der Oberklasse muss ich sie nun als virtual definieren, oder? Und wie kann ich bei Fighter einstellen, dass sie die Methode nicht besitzt?

    Ansonsten wäre die Initiative, Charakter so zu definieren, dass es dort kein SetMana (und auch die dazugehörige Variable) gibt, und diese erst in der Unterklasse definiert wird. Welche Lösung haltet ihr für besser? Und wie geht diese erst überhaupt? 🙂



  • Hi,

    Also ich weiß nicht das was du da machen willst ist eigentlich nur möglich wenn du die Methode SetMana nur für den "Sorcer" haben willst dann würde ich das nicht in der Parent-Class definieren sondern erst in der Klasse "Sorcer".

    class Charakter
    {
      public:
                 Charakter();
        virtual ~Charakter();
    
        virtual  SetLife(); // Every Charakter Child need this method
    };
    
    class Sorcer : public Charakter
    {
      public:
                  Sorcer(){};
       virtual   ~Sorcer(){};
      // hat SetLife von der Parent - Class geerbt
       void       SetMana(); // Soll diese Methode zusätzlich haben
    };
    
    class Fighter : public Charakter
    {
      public:
                 Fighter(){};
       virtual  ~Fighter(){};
       // hat SetLife von der Parent Class geerbt
    };
    

    Hierzu ist zusagen es gibt auch noch andere Möglichkeiten aber wenn du nur 2 Klassen von Charakter ableiten willst ist das IMHO die beste Möglichkeit.

    MfG eViLiSSiMo



  • es heißt übrigens Sorcerer



  • OK vielen Dank 🙂
    allerdings stellt sich jetzt ein neues Problem. Hier der Code zur Header-Datei:

    class Charakter
    {
    protected:
    	int itsRK, itsLife, itsCurrentLife, itsCurrentRK;
    public:
    	virtual int GetCurrentRK() const { return itsRK; }
    	virtual int GetCurrentLife() const { return itsCurrentLife; }
    	virtual int GetMaxLife() const { return itsLife; }
    	virtual int GetMaxRK() const { return itsRK; }
    	virtual void SetCurrentLife(int life) { itsCurrentLife = life; }
    	virtual void SetCurrentRK(int RK) { itsCurrentRK = RK; }
    
    	Charakter(int Life, int RK)
    	{
    		itsLife = Life;
    		itsRK = RK;
    		itsCurrentLife = itsLife;
    		itsCurrentRK = itsRK;
    	}
    
    	~Charakter()
    	{}
    };
    
    class Fighter : public Charakter
    {
    	Fighter(int Life, int RK)
    	{
    		itsLife = Life;
    		itsRK = RK;
    		itsCurrentLife = itsLife;
    		itsCurrentRK = itsRK;
    	}
    };
    
    class Sorcer : public Charakter
    {
    private:
    	int itsMana, itsCurrentMana;
    public:
    	int GetCurrentMana() const { return itsCurrentMana; }
    	int GetMaxMana() const { return itsMana }
    
    	Sorcer(int Life, int RK, int Mana)
    	{
    		itsLife = Life;
    		itsCurrentLife = itsLife;
    		itsRK = RK;
    		itsCurrentRK = itsRK;
    		itsMana = Mana;
    		itsCurrentMana = itsMana;
    	}
    
    	~Sorcer()
    	{}
    };
    

    Und hier der Code zu einer zum Test erstellten Application:

    #include <stdafx.h>
    #include <rpg.h>
    
    int main()
    {
    	Fighter Petach(14, 3);
    	Sorcer Jaina(7, 10, 1);
    	return 0;
    }
    

    Und hier kommen zwei Fehler:

    f:\programme\microsoft visual studio\vc98\include\rpg.h(28) : error C2512: 'Charakter' : no appropriate default constructor available
    F:\Projekte\RPG\RPG.cpp(6) : error C2248: 'Fighter::Fighter' : cannot access private member declared in class 'Fighter'
    f:\programme\microsoft visual studio\vc98\include\rpg.h(28) : see declaration of 'Fighter::Fighter'

    Also ich kann damit ehrlich gesagt gar nichts anfangen 😕 Hoffe ihr könnt da helfen ^^



  • is ganz einfach: du bentutzt eine initialisationsliste bei den abgeleiteten klassen, oder du definierst bei character einfach noch nen parameterlosen default ctor.

    also:

    //ctor von fighter
        Fighter(int Life, int RK):Character(Life,RK){}
    
    //ctor von character
        Charakter(int Life, int RK):itsLife(Life),itsRK(RK),itsCurrentLife(Life),itsCurrentRK(RK){}
    


  • Der Konstruktor von Fighter ist private, falls noch nicht bemerkt...



  • lol, garnich drauf geachtet 😮
    ich habs mir angewöhnt immer nur auf die erste fehlermeldung zu achten,die nächsten fehler ignoriere ich normalerweise erstmal, weil sie normalerweise eh nur folgefehler sind 😛



  • OK Danke ihr zwei, jetzt klappt alles 😉


Log in to reply