Zirkulare Abhängikeit bei #include ??



  • Hallo, ich habe mir zwei Klassen geschrieben Vector3D und Point3D. Nun muss sowohl Vector3D auf Inhalte von Point3D als auch anders herum zugreifen. Dabei bekomme ich folgende Fehlermeldung:

    In file included from point3d.h:4,
                     from point3d.cpp:5:
    vector3d.h:18: error: syntax error before `,' token
    
    In file included from vector3d.h:50,
                     from point3d.h:4,
                     from point3d.cpp:5:
    
    vector3d.cpp:29: error: syntax error before `,' token
    
    vector3d.cpp:29: confused by earlier errors, bailing out
    
    make.exe: *** [point3d.o] Error 1
    

    Dabei habe ich folgende Headerdateien:

    #ifndef VECTOR3D_H_
    #define VECTOR3D_H_
    
    #include "point3d.h"
    
    template<class T> class Vector3D {
    
        private:
            //-(Variablen)----------------------------------------------------------
            T n[3]; // x, y, z
    
        public:
    
            //-(Konstruktoren)------------------------------------------------------
            inline Vector3D(); // Vektor mit (0,0,0)
            inline Vector3D(const T x, const T y, const T z); // Vektor mit (x,y,z)
            inline Vector3D(const Vector3D<T>& v); // Vektor mit (v.x, v.y, v.z)
            inline Vector3D(const Point3D<T> a, const Point3D<T> b); // Erstellt einen Vektor der von a nach b zeigt.
    
        ...
    
    };
    
    #include "vector3d.cpp" // wegen eines Templatebugs in verschiedenen Compilern.
    
    #endif // VECTOR3D_H_
    
    #ifndef POINT3D_H_
    #define POINT3D_H_
    
    #include "vector3d.h"
    
    template<class T> class Point3D {
    
        private:
            //-(Variablen)----------------------------------------------------------
            T n[3]; // x, y, z
    
        public:
    
       ...
    };
    
    #include "point3d.cpp" // wegen eines Templatebugs in verschiedenen Compilern.
    
    #endif // POINT3D_H_
    

    Wie löse ich nun diese Abhängigkeit auf? 😕
    Wenn ich die #define weglasse wird der Compiler doch in einer Endlosschleife stecken bleiben!? 😮



  • Hallo,
    Das Zauberwort in deinem Fall nennt sich Forward-Deklaration. D.h. in vector.h machst du die Klasse Punkt3D bevor der Deklaration von Vector3D bekannt.

    #ifndef VECTOR3D_H_
    #define VECTOR3D_H_
    
    // #include "point3d.h" entfällt"
    
    // forward-Deklaration.
    template <class T>
    class Point3D;
    
    // Hier die Deklaration von Vector3D.
    // ...
    
    #endif
    

    Rest wie gehabt.

    Gruß Caipi



  • brauchst du wirklich beide Klassen in vollem Umfang bei der jeweils anderen? (Sprich: brauchst du außer zu wissen, dass es die Klasse gibt, auch deren methoden?) Sonst reicht eine forward-Deklaration.

    Des weiteren würde ich wegen der Ähnlichkeit der beiden Konzepte mal gucken, ob es nicht für ne Gemeinsame Basisklasse reicht.

    Schließlich und endlich mal ne Frage: was ist in deinem Verständnis der Unterschied zwischen einem Vektor und einem Punkt im 3D? Es gibt nämlich im Grunde keinen. Damit kannst du dir eines von beidem eigentlich sparen 😉



  • Danke, das trifft es mal wieder voll auf den Kopf. 🙂 🙂

    @pumuckl Da hast du recht aber dies ist Absicht damit man beim Rechnen damit nicht so viele Fehler macht und z.T. welche der Compiler erkennt 😃


Anmelden zum Antworten