Include Probleme & Dateimanagement
-
hi!
ich mache es momentan so, dass ich jeder klasse eine .h datei gebe für die deklaration und eine .cpp für den eigentlichen code.
ich habe jetzte eine gewisse anzahl an klassen (in seperaten dateien) und ich möchte dass jede dieser klassen auf die anderen zugreifen kann. wie mache ich das am besten? eine globale headerdatei funktioniert irgendwie nicht... trotz include-wächter in jeder .h-datei . Muss ich echt in jede Klassen-HeaderDatei ein include auf jegliche anderen klassendateien machen oder geht das irgendwie anders?hier ein beispiel wie ich es momentan mache (ohne include-wächter, die lasse ich jetzt mal raus):
Class1.h
class Class1 { /*...*/ Class2 *x; //Hier kommt das Problem! };
Class1.cpp
#include "Class1.h" Class1::Func1(/*...*/) { /*...*/ } /*...*/
Class2.h
class Class2 { /*...*/ Class1 *x; //Hier kommt das Problem! };
Class2.cpp
#include "Class2.h" Class2::Func1(/*...*/) { /*...*/ } /*...*/
und dann ne globale header (die ich dann ins projekt einbinde):
global.h
#include "Class1.h" #include "Class2.h"
da krieg ich aber immer die meldung in Class1.h "Class2" wäre undefiniert und umgekehrt!
manno! also, was muss ich ändern?vielen dank,
chris90
-
Hast du in den header files auch die Syntax
#ifndef deineclass #define deineclass class... #endif
verwendet?
Wenn Class1 und Class2 Zugriff auf einander haben sollen, dann muss#include "ClassX.h"
in header und den cpp files stehen, MEIN ich zumindest.
Du weisst ja das du dann nur Zugriff auf Public hast ne?Daniel
-
man kann dem compiler sagen, dass eine klasse später deklariert wird:
Class1.hclass Class2; class Class1 { /*...*/ Class2 *x; //Kein Problem! };
-
ich meine definiert.
-
klar könnte ich vor-deklarationen machen oder jede header-datei einzeln mit allen anderen verknüpfen, aber ginge es nicht prinzipiell mit einer globalen headerdatei, die alle anderen headerdateien einbindet, und die dann von jeder headerdatei einzeln eingebunden wird?
Bzw ich hab das schon ausprobiert - wieso geht es nicht oder hab ich da nur was falsch gemacht?danke für die schnellen antworten,
chris90
-
chris90 schrieb:
ich mache es momentan so, dass ich jeder klasse eine .h datei gebe für die deklaration und eine .cpp für den eigentlichen code.
Das ist so üblich ...
chris90 schrieb:
ich habe jetzte eine gewisse anzahl an klassen (in seperaten dateien) und ich möchte dass jede dieser klassen auf die anderen zugreifen kann.
das ist ein Design-Fehler.
Wenn Du Dein Programm strukturierst, solltest Du genau so etwas versuchen zu vermeiden. Alle Probleme, die Du im folgenden schilderst, sind nur eine Konsequenz davon.
Versuche Deine Klassenstruktur zumindest so weit zu entwirren, dass keine bidirektionalen Beziehungen vorkommen. D.h. Wenn eine Klasse A eine Klasse B kennt, so sollte auf keinen Fall B auch A kennen müssen.
// A.h #include "B.h" class A { // usw.
ist natürlich ok, aber B sollte in diesem Fall in keiner Weise von A abhängen. Das gilt in ähnlicher Weise auch für alle anderen zyklischen Bezüge. Also A kennt B, B kennt C dann sollte nicht C von A abhängig sein.
So weit möglich sind Forward-Deklarationen den includes vorzuziehen.Gruß
Werner
-
Ich hab halt momentan 3 Klassen A, B und C.
A hängt von B und C ab.
B hängt von C ab.
C hängt von B ab.Muss ich da echt mein komplettes Klassendesign ändern? Bitte nicht! *heul*
danke!
chris90
-
chris90 schrieb:
Ich hab halt momentan 3 Klassen A, B und C.
A hängt von B und C ab.
B hängt von C ab.
C hängt von B ab.Muss ich da echt mein komplettes Klassendesign ändern?
Nein - nicht gleich ALLES ändern. Das einzige Problem ist die bidirektionale also gegenseitge Abhängigkeit von B und C.
Wenn Du mindestens in einem der beiden Header - also "B.h" oder "C.h" - mit einer forward-Deklaration der jeweils anderen Klasse auskommst, so hast Du schon mal das gröbste überstanden.Ansonsten bleibt die Frage: worin besteht die gegenseitige Abhängikeit von B & C genau?
Gruß
Werner
-
Forward-Deklarationen sind in diesem Falle also die beste Lösung?
Die Abhängigkeit entsteht dadurch, dass Klasse B eine Instanz von Klasse C hat und
Klasse C eine Instanz von Klasse B.Vielen Dank
Chris90
-
chris90 schrieb:
Forward-Deklarationen sind in diesem Falle also die beste Lösung?
.. nicht in jedem Fall
chris90 schrieb:
Die Abhängigkeit entsteht dadurch, dass Klasse B eine Instanz von Klasse C hat und
Klasse C eine Instanz von Klasse B.Falls eine Klasse eine Instanz einer anderen als Member hat, so benötigt der Compiler die vollständige Definition, da er die Größe des Members bestimmen muss. Also ein #include "AndereKlasse.h".
Daraus folgt dann auch, dass "B hat C und C hat B" nicht gehen kann.
Wenn ein Objekt der Klasse B einen Member C hat, der wieder einen Member vom Typ B hat, usw. das kann Dir kein Compiler dieser Welt übersetzen.Was stellen B & C dar. Warum hast Du sie gegenseitig als Member vorgesehen?
Gruß
Werner
-
ich hab mirs nochmal angeschaut und hab es jetzt ohne gegenseitigen "Kurzschluss" hinbekommen. noch eine Frage: Wenn ich jetzt eine HeaderDatei in sämtliche Klassenheaderdateien einbinden möchte, wie mache ich das am besten? globale header, die dann erst die headerdatei und darunter alle anderen headerdateien einbindet oder muss ich die headerdatei dann direkt in jede einzelne headerdatei einbinden?
letzteres habe ich nämlich schon versucht, aber wegen dem Include-Wächter (ohne dem der Compiler ohnehin mehrfachincludierung zu bemeckern hätte) wird die header ja nur einmal eingebunden sprich in nur eine headerdatei. Dann meckern die anderen Header natüclich dass sie die entsprechenden definitionen der headerdatei nicht haben. wie kann ich das dann machen?nochmals danke,
chris90