Klassen



  • Ich komm einfach nicht drauf was ich falsch mache.

    Ich hab 3 Klassen, Person, Spieler/Player die von Person erbt und Spiel/Game die eine Instanz von Player enthält. Mal ein bischen Code um es zu veranschaulichen.

    Person.h:

    #pragma once
    //[...]
    class Person
    {
    protected:
    	ENTITY *Ent;
    
    	int healthy;
    	char *Name;
    
    public:
    	Person(char *Name, char *FileName, VECTOR *position);
    	Person(char *Name, char *FileName, VECTOR *position, EVENT event);
    	~Person(void);
    
            //[...]
    };
    

    Player.h:

    #pragma once
    #include "Person.h"
    #include "Game.h"
    //[...]
    class Player :
    	public Person
    {
    public:
    	Player(char *Name, char *FileName, VECTOR *position);
    	~Player(void);
    
    protected:
    	void setEvent();
    	static void Event()
    	{
    		//Event Hit
    		if([...])
    		{
                //C2039: 'Schueler' kein Element von 'Game'
    			Game::Schueler->Hit(5);
    		}
    	}
    };
    

    Game.h

    #pragma once
    #include "Player.h"
    //[...]
    
    class Game
    {
    protected:
    	static bool Running;
    public:
            //C2143: Synatax Fehler es fehlt ';' vor '*'
            //->'default-int' Fehler
    	static Player *Schueler;
    //[...]
    };
    

    Irgendjemand ne Idee woher die Fehler kommen?
    Danke im Voraus SWW13.



  • naja - du hast ne kreisabhängigkeit drin...
    versuch ma ds in der game.h zu schreiben:

    #pragma once 
    
    //#include "Player.h" brauchst du nicht mehr, wir nehmen ne forward deklaration
    
    class Game 
    { 
    protected: 
        static bool Running; 
    public: 
    
        static class Player *Schueler; //die forward-deklaration kann man auch einzeln machen, aber ich finds so schöner ^^
    };
    

    noch mal zur erklärung, warum deins net ging:
    player.h included game.h, die will wiederrum wieder die player.h includen - der compiler bricht den ring auf und schon compiliert er eins von beiden, ohne das andere zu kennen... so was sollte man vermeiden - udn wenn mans net vermeiden kann, muss man eben gucken, dass ne forward-deklaration reicht...
    wobei es hier au scho reichen würde, die implementationen in die *.cpp zu verschieben und demzufolge dort auch erst game.h zu includen...

    bb



  • Danke für die schnelle Antwort das ganze tut soweit, bloß mekert er jetzt an einer Methode von Game rum, die den Konstruktor von Player aufruft:

    void Game::createPlayer()
    {
        //C2514: 'Player': Klasse besitzt keine Konstruktoren
    	Schueler = new Player([...]);
    }
    

    Das selbe beim Aufruf einer anderen Methode von Player, ich hab schon versucht ein 'class' anzufügen, ohne Erfolg. Gibt es beim Methoden/Konstruktor Aufruf nen extra Schlüßelwort für forward-deklaration?


  • Administrator

    In der Game.cpp musst du natürlich Player.h inkludieren. Such mal nach "Forward Declaration", damit duch auch verstehst, was hier gemacht wird. Bin grad zu faul, dazu eine Erklärung abzugeben 🙂

    Grüssli



  • Danke an euch, das inkludieren der "Player.h" wirkt Wunder. Forward Declaration war genau was ich gebraucht hab.



  • SWW13 schrieb:

    Danke an euch, das inkludieren der "Player.h" wirkt Wunder. Forward Declaration war genau was ich gebraucht hab.

    genau deshalb hab ichs ja geschrieben : >


Anmelden zum Antworten