typedefs in zwei .h Files gegenseitig nutzen
-
Hi,
hier erst mal ein bissle Code mit 2 verschiedenen .h Dateien und typedefs die in der jeweils anderen genutzt werden:
/* share.h */ #include "session.h" class share { /* the size of the share id in bytes */ public: static const unsigned SHARE_ID_SIZE = 64; typedef std::array<unsigned char, SHARE_ID_SIZE> ShareId; typedef unsigned VersionType; struct observer { observer(session::SessionId id = session::INVALID_SESSION_ID, unsigned off = 0) : sessionId( id ), offset( off ) { } session::SessionId sessionId; unsigned offset; }; } /* session.h */ #include "share.h" class session { public: typedef boost::function<void (unsigned)> EndSessionHandler; typedef boost::function<void (session*, share::ShareId)> RegisterShareHandler; typedef unsigned int SessionId; static SessionId const INVALID_SESSION_ID = 0 ; }In den Klassen sind auch noch ein paar Funktionen die die verschiedenen typedefs verwenden, aber das Problem konnt ich loesen indem ich die implementierung einfach in ne cpp Datei gepackt hab.
Aber jetzt bekomm ich immer: "share / session ist keine Klasse blabla". Klaro versteh ich au, aber wie loes ich das am besten.
Ich hab mir gedacht die typedefs einfach in nen eigenen Header schreiben, aber dann sind se ja nicht mehr in der Klasse drin und man wuerd z.B. statt:
share::ShareId ideinfach nur
ShareId idschreiben was ich persoenlich ned so schoen find.
Gruessle
-
Erst einmal für den Fall, dass du C&P benutzt hast: Da fehlen Semikola an beiden Klassendefinitions-enden.
C0de4Fun schrieb:
man wuerd z.B. statt:
share::ShareId ideinfach nur
ShareId idschreiben was ich persoenlich ned so schoen find.
Den "selben Effekt" kannst du mit Namespaces erzielen.
Edit: Ah, jetzt seh ich, nun, wenn du Die Typedefs für beide brauchst, dann müssen die Typedefs natürlich vorher gemacht werden. Wie du das anstellst, ist dir überlassen, aber an der zyklischen Abhängigkeit kommst du nicht vorbei.
-
Hacker schrieb:
Wie du das anstellst, ist dir überlassen, aber an der zyklischen Abhängigkeit kommst du nicht vorbei.
Krampf. Schau dir den Code mal genauer an, dann siehst du folgendes:
share hängt NICHT von session::SessionId ab, abhängig ist nur session::observer. Deshalb ist die Lösung ganz simpel:class share { blablabla struct observer; };Und dann in der share.cpp session.h einbinden und share::observer definieren. Somit ist die zyklische Abhängigkeit zwischen share.h und session.h aufgebrochen.