Vorwärtsdeklaration zweier Klassen



  • Ich versuche zurzeit ein Problem zu lösen in dem zwei Klassen in einer zyklischen Abhängigkeit stehen und versuche es mit einer Vorwärtsdeklaration zu lösen, allerdings verstehe ich den Sinn einer Vorwärtsdeklaration noch nicht richtig, beziehungsweise wie man diese sinvoll einsetzt.

    Celsius.h:

    #include <iostream>
    
    using namespace std;
    
    class Fahrenheit;
    
    class Celsius
    {
        public:
             Celsius(double grad)
    {
           celsius_temp=grad;
    }
    
            Celsius(const Fahrenheit& other) //Kopierkonstruktor zum Umwandeln von Fahrenheit in Celsius, bekomme aber immer einen Fehler
    {
             celsius_temp=((5/9)*(other.fahrenheit_temp-32));
    }
    
        private:
            double celsius_temp=0;
    };
    

    Fahrenheit.h:

    #include <iostream>
    
    using namespace std;
    
    class Fahrenheit
    {
        
        public:
            Fahrenheit(double grad)
            {
                   fahrenheit_temp=grad;
            }
    
    Fahrenheit(const Celsius& other) 
    {
             celsius_temp=((9/5)*other.celsius_temp+32);
    }
    
        private:
            double fahrenheit_temp=0;
    };
    

    Main.cpp:

    #include <iostream>
    #include "Celsius.h"
    #include "Fahrenheit.h"
    
    using namespace std;
    
    int main()
    {
        
    Celsius c2(100); 
        Fahrenheit f2(32.0); 
    
        c2=f2; //Fahrenheit soll in Ceslsius umgerechnet werden und in Celsius gespeichert werden
        f2=c2;
    }
    

    Danke schonmal für eure Hilfe.



  • Die Sinnhaftigkeit ergibt sich erst, wenn die Farenheit.h auch eine respektive Fahrenheit.cpp bekommt, gleiches für Celsius. Dann verschiebst du die Implementierungen der Memberfunktionen in die Sourcedateien.

    Übergibst du dann die Celsius oder Fahrenheit Objekte per Referenz oder Pointer, reicht es wenn eine Vorwärtsdeklaration existiert. Die Definitionen brauchst du dann nur noch in den Sourcedateien.

    A_fwd.h

    class A;
    

    A.h

    class A {};
    

    B.h

    #include "A_fwd.h"
    class B
    {
      void foo(A const& a); // fwd decl von A reicht hier.
    }:
    

    B.cpp

    #include "A.h" // jetzt hier die komplette Defintion.
    
    B::foo(A const& a)
    {
      // ...
    }
    


  • @Goleo3006

    celsius.h:

    #ifndef celsius_h
    #define celsius_h
    
    class Fahrenheit;
    
    class Celsius
    {
        public:
             Celsius(double grad)
    			{
           		celsius_temp=grad;
    			}
    
         		double temp() const {return celsius_temp;}
    
             Celsius(const Fahrenheit& other);
             
        private:
             double celsius_temp=0;
    };
    
    #endif
    

    fahrenheit.h:

    #ifndef fahrenheit_h
    #define fahrenheit_h
    
    class celsius;
    
    class Fahrenheit
    {
        
        public:
            Fahrenheit(double grad)
            {
               fahrenheit_temp=grad;
            }
    
    		  Fahrenheit(const Celsius& other); 
    
        	  double temp() const {return fahrenheit_temp;}
    
    
        private:
            double fahrenheit_temp=0;
    };
    #endif
    

    celsius.cpp:

    #include "celsius.h"
    #include "fahrenheit.h"
    
    
    Celsius::Celsius(const Fahrenheit& other)
    {
    	celsius_temp=((5/9)*(other.temp()-32));
    }
    

    fahrenheit.cpp:

    #include "celsius.h"
    #include "fahrenheit.h"
    
    
    Fahrenheit::Fahrenheit(const Celsius& other) 
    {
        fahrenheit_temp=((9/5)*other.temp()+32);
    }
    

    main.cpp:

    #include <iostream>
    #include "Celsius.h"
    #include "Fahrenheit.h"
    
    using namespace std;
    
    int main()
    {
        
    	 Celsius c2(100); 
        Fahrenheit f2(32.0); 
    
        c2=f2; //Fahrenheit soll in Ceslsius umgerechnet werden und in Celsius gespeichert werden
        f2=c2;
    }
    


  • Vielenk dank jetzt funktioniert es 👍🏼


Log in to reply