Wiedermal problem mit oberklasse + Abgeleitete



  • Heute is irgendwie nicht mein Tag, ich erkenn die einfachsten fehler nicht(wobei mir das bei eigenem Code ohnehin schwerfällt).
    Diesmal hab ich eine DLL Oberklasse + DLL Unterklasse, Die unterklasse hat diverse private Mebervariablen. Für jede dieser Variablen hab ich in der Unterklasse ne get, bzw. set Funktion. Wenn ich jetzt von einer anderen Klasse drauf zugreifen will um über set div. Werte zu ändern meckert der Compiler, dass die get-, set-Funktion nicht in der Oberklasse definiert ist. Stimmt, aber was interessiert mich die Oberklasse?

    Kann mir da einer helfen?

    mfg
    Glamdring



  • Ich poste hier mal ungfähr meinen Code:

    namespace all
    {
    class DLL Player : public Object
    	{
    	protected:
    		int anz_buildings, used_support, max_now_support;
    	public:
    		std::list<smart_ptr<Warrior> > units;
    		std::list<smart_ptr<building> > buildings;
    	public:
    		inline int get_anz_buildings(){return(anz_buildings);} 
    		inline int get_used_support(){return(used_support);}
    		inline int get_max_now_support(){return(max_now_support);}
    		inline void set_anz_buildings(int n){anz_buildings = n;}
    		inline void set_used_support(int n){used_support = n;}
    		inline void set_max_now_support(int n){max_now_support = n;}
    		friend class Warrior;
    		virtual ~Player() = 0;
    	};}
    namespace humans
    {
    namespace humans
    {
    	DLL enum Partr{Perser, Wikinger, Hunnen};
    
    	class DLL human_Player : public all::Player
    	{
    	protected:
    		Partr Stamm;
    		int wood, food, metal, mana;
    	public:
    		int get_wood(){return(wood);}
    		int get_metal(){return(metal);}
    		int get_food(){return(food);}
    		int get_mana(){return(mana);}
    		void set_wood(int nwood){wood = nwood;}
    		void set_metal(int nmetal){metal = nmetal;}
    		void set_food(int nfood){food = nfood;}
    		void set_mana(int nmana){mana = nmana;}
    		human_Player(Partr nStamm);
    		~human_Player();
    	};
        class Arbeiter
        {
        //normale Klasse
        };
    }
    humans::Schwertkmpfer::Schwertkmpfer(humans::human_Player* nowner) 
    {
    	owner = nowner;
    	if(owner->get_food() >= 50 && owner->get_metal() >= 10 && (owner->get_used_support() + 1) <= owner->get_max_now_support())
    	{
    		owner->set_food(owner->get_food() - 50);
    		owner->set_metal(owner->get_metal() - 10);
    		owner->set_used_support(owner->get_used_support()+1);
    
    		dmga = Schwertkmpfers::dmga;
    		dmgg = Schwertkmpfers::dmgg;
    		dmg = Schwertkmpfers::dmg;
    		HP = Schwertkmpfers::HP;
    		armor = Schwertkmpfers::armor;
    		see = Schwertkmpfers::see;
    		radius = Schwertkmpfers::radius;
    		fast = Schwertkmpfers::fast;
    		flying = Schwertkmpfers::flying;
    		freq = Schwertkmpfers::freq;
    		mana = Schwertkmpfers::mana;
    		mut = Schwertkmpfers::mut;
    		now_exp = Schwertkmpfers::now_exp;
    		give_exp = Schwertkmpfers::give_exp;
    		needed_exp = Schwertkmpfers::needed_exp;
    		level = Schwertkmpfers::level;
    
    		setbeing(special::humans, special::Schwertkmpfer);
    	}
    	else
    	{
    		owner->units.pop_back();
    	}
    }
    

    Der Compiler bringt folgende Meldungen:
    Error C2039: 'get_food' : Ist kein Element von 'Player' .....

    thx
    Glamdring



  • owner ist vom Typ Player*, du rufst aber Funktionen auf, die Player nicht hat (get_food zum Beispiel).



  • Glamdrink schrieb:

    Heute is irgendwie nicht mein Tag

    zumindest bei einer Sache hatte ich Recht!

    thx



  • Ich fürchte, dass ich noch so eine Noob-Frage stellen muss:

    folgender Code:

    namespace humans
    {
    	class Warriors
    	{
    	public:
    		static int dmga, dmgg, dmg, HP,mana, armor, fast, see, freq, radius, mut;
    		static bool flying;
    		static int give_exp, now_exp, needed_exp, level;
    	public:
    		Warriors(){}
    		virtual ~Warriors() = 0;
    	};
    
    	class Arbeiters : public Warriors 
    	{
    	public:
    		static int holz, nahrung, metal;
    	};
    
    	class Schwertkmpfers : public Warriors {};
    }
    

    Soweit müsste das richtig sein, aber hier meine .cpp Datei:

    bool humans::Arbeiters::flying = false;
    int humans::Arbeiters::holz = 5;
    int humans::Arbeiters::nahrung = 5;
    int humans::Arbeiters::metal = 5;
    int humans::Arbeiters::dmgg = 3;
    int humans::Arbeiters::dmga = 0;
    int humans::Arbeiters::dmg = 3;
    int humans::Arbeiters::freq = 50;
    int humans::Arbeiters::HP = 30;
    int humans::Arbeiters::armor = 1;
    int humans::Arbeiters::fast = 5;
    int humans::Arbeiters::see = 5;
    int humans::Arbeiters::mut = 10;
    int humans::Arbeiters::radius = 1;
    int humans::Arbeiters::mana = 0;
    int humans::Arbeiters::now_exp = 0;
    int humans::Arbeiters::give_exp = 10;
    int humans::Arbeiters::needed_exp = 20;
    int humans::Arbeiters::level = 0;
    
    bool humans::Schwertkmpfers::flying = false;
    int humans::Schwertkmpfers::dmgg = 5;
    int humans::Schwertkmpfers::dmga = 0;
    int humans::Schwertkmpfers::dmg = 8;
    int humans::Schwertkmpfers::freq = 60;
    int humans::Schwertkmpfers::HP = 40;
    int humans::Schwertkmpfers::armor = 2;
    int humans::Schwertkmpfers::fast = 5;
    int humans::Schwertkmpfers::see = 5;
    int humans::Schwertkmpfers::mut = 10;
    int humans::Schwertkmpfers::radius = 1;
    int humans::Schwertkmpfers::mana = 0;
    int humans::Schwertkmpfers::now_exp = 0;
    int humans::Schwertkmpfers::give_exp = 20;
    int humans::Schwertkmpfers::needed_exp = 50;
    int humans::Schwertkmpfers::level = 0;
    

    Der Compiler meckert:
    'public: static bool humans::Warriors::flying' : Neudefinition; Mehrfachinitialisierung

    Und das bei jeder Static-Definition

    ich hab vorher noch nie mit staticmembers gearbeitet, aber laut meinem nachschlagwerk müsste das so richtig sein.

    Was mach ich diesmal falsch ?

    thx
    Glamdring



  • Hi!

    Arbeiters und Schwertkämpfers, das nenn ich mal ne geile Pluralbildung...

    Die Frage ist es, ob es hier denn sinnvoll ist zu erben. Generell wäre es wohl sinnvoller eine Mensch(Human)-Klasse zu haben und die anderen davon zu erben(Ist ein Arbeiter ein Krieger?).

    Das nächste Problem: static->Variablen gehören zur Klasse, nicht zum Objekt. Das heißt, alle Warriors teilen sich ein und die selbe Variable, sicher daß Du das willst?
    Und bloß weil Du jetzt erbst gehören die Variablen aus Warrior immer noch zu Warrior, und sind somit auch in allen Unterklassen enthalten, das heißt alle Klassen zusammen teilen sich diesen einen Satz von Variablen. Was wohl auch erklären dürfte, warum Du sie nicht mehrfach anlegen darfst.

    MfG Jester



  • Das s am Ende stand für Struktur, weils hat früher Strukturen zu den richtigen Klassen (ohne s) sind. Sie sollten die Standardwerte für die jeweiligen Klassen beinhalten, so dass man bei upgrades nur die Struktur ändern müsste, um die jeweiligen Krieger zu verändern, für die bereits gebauten hab ich ein anderes System.

    Danke

    Glamdring



  • Ich hoffe das ist endlich die letzte Frage:

    Ich habe von 3 basisklassen jeweils einen pure virtual dtor. Der Compiler meckert:
    rror LNK2001: Nichtaufgeloestes externes Symbol "public: virtual __thiscall all::Warrior::~Warrior(void)" (??1Warrior@all@@UAE@XZ)

    Was soll ich jetzt machen? Das mit Pragma ausschlaten, wenns die DLL nicht beinflusst, den dtor nur virtual machen, der dann nichts tut 😕

    thx
    Glamdring



  • auch pure virtual destruktoren müssen implementiert werden

    class x {
      ~x () = 0;
    };
    
    x::~x () {}
    


  • Achso, das wusste ich nicht, danke

    mfg
    Glamdring


Anmelden zum Antworten