zirkuläre Abhängigkeit auflösen



  • also ich hab das Problem mal wie folgt abstrahiert (liefert die gleiche Fehlermeldung)

    //header h0.h
    #ifndef __h0_h__
    #define __h0_h__
    
    #include "h1.h"
    
    namespace n0
    {
    	class h0
    	{
    		public:
    			n1::h1 _dep;
    			void set_dep(n1::h1 dep);
    	};
    };
    
    #endif
    
    //cpp h0.cpp
    #ifndef __h0_cpp__
    #define __h0_cpp__
    
    #include "h0.h"
    
    void n0::h0::set_dep(n1::h1 dep)
    {
    	_dep = dep;
    }
    
    #endif
    
    //header h1.h
    #ifndef __h1_h__
    #define __h1_h__
    
    #include "h2.h"
    
    namespace n1
    {
    	class h1
    	{
    		public:
    			n2::h2 _dep;
    			void set_dep(n2::h2 dep);
    	};
    };
    
    #endif
    
    //cpp h1.cpp
    #ifndef __h1_cpp__
    #define __h1_cpp__
    
    #include "h1.h"
    
    void n0::h0::set_dep(n2::h2 dep)
    {
    	_dep = dep;
    }
    
    #endif
    
    //header h2.h
    #ifndef __h2_h__
    #define __h2_h__
    
    #include "h0.h"
    
    namespace n2
    {
    	class h2
    	{
    		public:
    			n0::h0 _dep;
    			void set_dep(n0::h0 dep);
    	};
    };
    
    #endif
    
    //cpp h2.cpp
    #ifndef __h2_cpp__
    #define __h2_cpp__
    
    #include "h2.h"
    
    void n2::h2::set_dep(n0::h0 dep)
    {
    	_dep = dep;
    }
    
    #endif
    
    #include "h0.h"
    #include "h1.h"
    #include "h2.h"
    
    int main()
    {
    	n0::h0 o0;
    	n1::h1 o1;
    	n2::h2 o2;
    	return 0;
    };
    

    wie man sieht besteht eine zirkuläre abhängikeit h0->h1->h2->h0. normalerweise löst man das ja damit das man eine der klassen schon vorher deklariert und später näher ausführt aber irgendwie klappt das hier nicht

    wenn ich den h0.h header z.B. wie folgt ändere:

    #ifndef __h0_h__
    #define __h0_h__
    
    namespace n1
    {
    	class h1;
    }
    
    namespace n2
    {
    	class h2;
    }
    
    namespace n0
    {
    	class h0
    	{
    		public:
    			n1::h1 _dep;
    			void set_dep(n1::h1 dep);
    	};
    };
    
    #include "h1.h"
    

    bekomme ich die Fehlermeldung:

    error C2079: 'n0::h0::_dep' verwendet undefiniertes class 'n1::h1'
    

    also ich wäre für jede Hilfe dankbar, weiß nämlich nicht mehr weiter.
    Danke schonmal im Voraus


  • Administrator

    In dieser Art nicht möglich. Mit einer Vorwärtsdeklaration kann man nur Zeiger und Referenzen definieren. Keine Objekte erstellen und keine Methoden aufrufen, dazu muss die ganze Klasse bekannt sein.

    Daher könntest du zum Beispiel einen Zeiger nehmen und dann in der *.cpp im Konstruktor per new ein Objekt erstellen. Das würde funktionieren. In der *.cpp muss dann allerdings die Klasse vollständig bekannt sein.

    Aber ich würde mir eher nochmals Gedanken zum Design machen. Sowas ist eher unüblich.

    Grüssli



  • schonmal gut zu wissen das es nicht geht, dann werde ich mir wohl was anderes einfallen lassen müssen. danke trotzdem


Anmelden zum Antworten