Klassen mit static methoden gegenseitig benutzen



  • Hallo,
    ich hab folgendes Problem. Ich hab zwei Klassen, welche jede einen Pointer auf ein Objekt von der Anderen enthällt. Soweit ließe sich das ja mit Forward Deklarationen lösen. Nun hat die eine Klasse aber eine statische Memberfunktion, worin sie auf den Pointer auf ein Objekt der anderen Klasse zugreifen muss. Dies funktioniert nicht.
    Meine Klassen sehen wie folgt aus:

    class Mouse  
    {
    private:
    	float X;
    	float Y;
    	System* ParentSystem;
    
    public:
    	void Actualize ();
    	void Display ();
    	Mouse(System* system, float x = -1, float y = -1);
    	virtual ~Mouse ();
    friend class System;
    };
    

    und:

    class System  
    {
    private:
    	static System* CurrentSystem;
    	Mouse* CurrentMouse;
    public:
    	int ScreenWidth;	
    	int ScreenHeight;
    
    	bool static Refresh()
    	{
    	    System::CurrentSystem->CurrentMouse->Actualize(); //hier treten die ersten Fehlermeldungen auf
    	}
    
    	void static System::Display()
    	{
    	     CurrentSystem->CurrentMouse->Display();
    	}
    	void SetMouse (Mouse* mouse);
    
    	System(int width = 1024, int height =768);
    	virtual ~System();
    friend class Mouse;
    
    };
    

    Dies führt zu mehreren Fehlermeldungen:

    : error C2027: use of undefined type 'Mouse'
    : see declaration of 'Mouse'
    : error C2227: left of '->Actualize' must point to class/struct/union
    

    Ich hab keine Ahnung, was ich machen soll. Ich bin für jede Hilfe dankbar!!!



  • Erm, Refresh und Display in der .cpp implementieren?
    Alternativ einfach die Mouse-Definition einbinden...



  • Ich hab jeweils den anderen Header in den Headern eingebunden und auch schon eine Forward-Deklaration beider Klassen gemacht, das hilft aber nicht. Er erkennt ja auch den Pointer auf eine Objekt der anderen Klasse an, bloß diesen in einer static Memberfunktion zu benutzen, das funktioniert nicht.



  • Verschieb mal die Implementierungen aus dem Header in den CPP-File. Danach müsste
    das mit der Forward-Deklaration funktionieren.



  • Kann man auch static memberfunktionen in der cpp implementieren?



  • Klar 🙂



  • // Mouse.hpp
    
    class System;
    
    class Mouse  
    {
    // ...
    };
    
    // Mouse.cpp
    
    #include "Mouse.hpp"
    #include "System.hpp"
    
    // System.hpp
    
    #include "Mouse.hpp" // <---
    
    class System
    {
    // ...
    };
    

    Alternativ einfach

    // System.hpp
    class System
    {
      // Refresh und Display nur deklarieren...
      bool static Refresh();
      void static Display(); // <--- nicht System::Display()
    };
    
    // System.cpp
    
    bool System::Refresh()
    {
      CurrentSystem->CurrentMouse->Actualize();
    }
    
    void System::Display()
    {
      CurrentSystem->CurrentMouse->Display();
    }
    


  • Ui, danke dir, dann hab ich da irgendwas falsch im Hinterkopf gehabt...
    Ich probiers sofort aus...



  • Danke, das funktionier soweit wunderbar!!

    Leider hab ich jetzt das Problem, das sobald ich CurrentSystem irgendwo in der System.cpp benutze ich den Fehler:

    System.obj : error LNK2001: unresolved external symbol "public: static class System * System::CurrentSystem" (?CurrentSystem@System@@2PAV1@A)
    

    Dies passiert nur, wenn die folgende Zeile in der Implementierung von System:.Refresh vorhanden ist.

    bool System::Refresh()
    {
         CurrentSystem->CurrentMouse->Actualize();
    }
    

    Ich hoffe, ihr könnt mir auch hier helfen.
    Vielen Dank schon mal im Vorraus



  • // System.hpp
    
    System* System::CurrentSystem(0);
    

    Allerdings hast du damit noch kein System Objekt.



  • Das hab ich schon versucht, dann krieg ich folgende Fehlermeldungen in der eingefügten Zeile:

    : error C2059: syntax error : 'constant'
    : error C2063: 'CurrentSystem' : not a function
    : error C2372: 'CurrentSystem' : redefinition; different types of indirection
    : see declaration of 'CurrentSystem'
    

    Woran liegt das? Was mache ich falsch?



  • Danke, hab das Problem gelöst indem ich

    System* System::CurrentSystem = 0;
    

    geschrieben hab.

    Funzt jetzt alles super, danke euch!!!


Anmelden zum Antworten