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 1Dabei 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. // ... #endifRest 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
