 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Lars T. Droegemueller Guest
|
Posted: Tue Feb 14, 2006 5:06 pm Post subject: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
hiho,
ich arbeite an einem Programm das eine Engine enthält die ich später für
ein Pong oder Breakout ähnliches Spiel verwenden will. Also Bälle die von
Wänden, Blöcken etc abprallen. Ich hab jetzt ein kleines Problem mit der
Vorwärtsdeklaration von Strukturen. Also immer der Reihe nach:
Ich habe eine Klasse "ball". Die ist für die Bälle auf dem Bild (achso ).
Diese Klasse erbt von einigen template-Klassen um Events empfangen zu
können, die von anderen Objekten gesendet werden (zum Beispiel wird jeden
Frame eine Event gesendet, das den Ball anweist sich einen Frame weiter zu
bewegen). Dabei ist jedes Event in eine Struktur verpackt. Der Typ der
Struktur die gesendet wird gibt erstens an welche Objekte das Event
überhaupt empfangen kann (die, die von der Listener-Klasse mit der
Event-Struktur als Templateparameter geerbt haben, so wie "ball" wie
bereits erwähnt), und ausserdem kann es zusätzliche Informationen zu dem
Event enthalten, zum Beispiel wird bei den Events die der Ball senden kann
ein Zeiger auf den Ball in dem Event gespeichert.
Alle Events (also die Strukturen) werden in dem gleichen header deklariert.
eines der Events enthält wie gesagt einen Zeiger auf ball, um den Absender
des Events anzugeben. Also inkludiert der Header events.h den Header
ball.h. Die Klasse "ball" ihrerseits erbt von einem Klassen-template dem
man eine der Eventstrukturen übergeben muss, ganz im Stil:
| Quote: | class ball:
public Listener<onFrameEvent>,
public Listener<onDrawEvent
{ //etc
|
Also inkludiert ball.h den Header events.h, damit die Strukturen bekannt
sind. Logischerweise gibt es jetzt Fehler, weil in dem Header der zu letzt
kompiliert wird irgendwas nicht deklariert ist, bei mir ist "ball" in
events.h nicht deklariert weil ball.cpp zuerst kompiliert wird.
Ich hab also zu events.h auch noch eine Übersetzungseinheit mit den ganzen
Deklarationen gebastelt, und hab in events.h nur sowas geschrieben:
| Quote: | struct onFrameEvent;
struct onDrawEvent;
//etc
|
So brauch ich ball.h nicht inkludieren. Jetzt meckert er beim Senden der
Events in eigentlich allen Übersetzungseinheiten, dass meine Events alle
nicht deffiniert sind. Geht das mit der Vorwärtsdeklaration so nicht? Bei
Klassen geht das doch auch.
Im Moment hab ich eine Vorwärtsdeklaration von ball in events.h und
inkludier ball.h einfach nicht mehr... aber das is imho keine schöne
Lösung. Ggf kann man die ganzen Strukturen für die Events noch zu Klassen
machen, aber dann müsste ich für die 3-4 Aufrufe die es im Programm gibt
erstmal ne Schnittstellenfunktion machen, damit die Klasse auch in einem
guten Stil bleibt. In Strukturen is ja eh alles public, da brauch ich keine
extra Funktionen.
Also:
- Weiterhin die Vorwärtsdeklaration von ball in events.h lassen
- Vernünftige Art der Vorwärtsdeklaration für die Event-Strukturen finden,
und diese dann vollständig in extra Übersetzungseinheit schreiben
- Strukturen zu Klassen machen
- sich im Usenet aufklären lassen und was noch viel besseres machen
mfg Lars Drögemüller aka Backe, danke dass ihr euch die Zeit nehmt.
Yippie, erster Beitrag im Usenet :D
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Tue Feb 14, 2006 6:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
Lars T. Droegemueller wrote:
[reichlich langer Text über zyklische Abhängigkeiten]
Der Kern, den es zu vestehen gilt, ist einfach, wann eine Definition
gebraucht wird und wann eine Deklaration ausreicht (was, natürlich,
voraussetzt, dass man zwischen Deklarationen und Definitionen
unterscheiden kann...). Dann kann man entscheiden, was wo deklariert
werden muß und wofür man Definitionen braucht.
Im Prinzip ist die Regel ganz einfach: wenn man etwas über eine
Struktur wissen muß, etwa, wie groß sie ist oder welche Methoden
sie hat, dann braucht man eine Definition. Ansonsten reicht eine
Deklaration.
Aus dieser Regel ergibt sich etwa, dass man eine Basisklasse
definieren muß bevor man eine abgeleitete Klasse definieren kann.
Dagegen reicht es aus, eine Deklaration zu haben, wenn man einen
Zeiger oder eine Referenz auf eine Klasse verwendet - solange, bis
man über die Referenz oder den Zeiger auf einen Member zugreifen
will.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Lars T. Droegemueller Guest
|
Posted: Wed Feb 15, 2006 12:06 am Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
Am Tue, 14 Feb 2006 18:14:18 +0100 schrieb Dietmar Kuehl:
| Quote: | Lars T. Droegemueller wrote:
[reichlich langer Text über zyklische Abhängigkeiten]
Ich hab immer ein bisschen Angst dass man mich nicht versteht wenn ich zu |
viel weglasse, vielleicht sollte ich mir das abgewöhnen...
| Quote: | Der Kern, den es zu vestehen gilt, ist einfach, wann eine Definition
gebraucht wird und wann eine Deklaration ausreicht (was, natürlich,
voraussetzt, dass man zwischen Deklarationen und Definitionen
unterscheiden kann...). Dann kann man entscheiden, was wo deklariert
werden muß und wofür man Definitionen braucht.
Ich seh im Nachhinein dass ich tatsächlich etwas durcheinander gebracht hab |
was was ist, das tut mir leid.. Prinzipiell kenn ich den Unterschied, keine
Ahnung warum ich das so durcheinander gebracht hab.
| Quote: | Aus dieser Regel ergibt sich etwa, dass man eine Basisklasse
definieren muß bevor man eine abgeleitete Klasse definieren kann.
Dagegen reicht es aus, eine Deklaration zu haben, wenn man einen
Zeiger oder eine Referenz auf eine Klasse verwendet.
Das leuchtet ein, aber ist der eleganteste Weg das zu lösen wirklich |
einfach die Inklusion wegzulassen und die Vorwärtsdeklaration der Klasse zu
schreiben?
mfg Lars D.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Wed Feb 15, 2006 4:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
Lars T. Droegemueller wrote:
| Quote: | Das leuchtet ein, aber ist der eleganteste Weg das zu lösen wirklich
einfach die Inklusion wegzulassen und die Vorwärtsdeklaration der Klasse
zu schreiben?
|
Wenn es zyklische Abhängigkeiten gibt, dann muß man diese irgendwo
auflösen. Da eine Klassendeklaration von nicht abhängt, ist das
der Richtige Weg. Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Jirka Klaue Guest
|
Posted: Wed Feb 15, 2006 7:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geh t nicht |
|
|
Dietmar Kuehl:
| Quote: | Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
|
Das wirft aber die Frage auf, warum man sowas überhaupt in mehrere Klassen
aufteilt.
Jirka
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Lars T. Droegemueller Guest
|
Posted: Wed Feb 15, 2006 7:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
Am Wed, 15 Feb 2006 16:06:45 +0100 schrieb Dietmar Kuehl:
| Quote: | Lars T. Droegemueller wrote:
Das leuchtet ein, aber ist der eleganteste Weg das zu lösen wirklich
einfach die Inklusion wegzulassen und die Vorwärtsdeklaration der Klasse
zu schreiben?
[...] Da eine Klassendeklaration von nicht abhängt, ist das
der Richtige Weg.
Hab ich jetzt so gemacht, funktionniert prima, danke. |
| Quote: | Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
|
Was du nicht wissen kannst: In dem Header mit den Event-Strukturen sind
alle Event-Strukturen deffiniert (nicht deklariert. Ja, ich bin sicher ),
auch die, die von meiner ball Klasse nicht direkt gebraucht werden. Für den
Fall, dass ich im Nachhinein irgendein Event senden lassen will, das an der
Stelle vorher überhaupt nicht beteiligt war. Grundsätzlich geb ich dir aber
Recht ;)
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Lars T. Droegemueller Guest
|
Posted: Wed Feb 15, 2006 8:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geh t nicht |
|
|
Am Wed, 15 Feb 2006 16:37:58 +0100 schrieb Jirka Klaue:
| Quote: | Dietmar Kuehl:
Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
Das wirft aber die Frage auf, warum man sowas überhaupt in mehrere Klassen
aufteilt.
Jirka
|
Naja, bei mir wird der header beziehungsweise die darin deffinierten
Klassen sowieso von mehr als nur einer Klasse gebraucht. Event-Handling
ebend. Eine Klasse sendet, eine andere empfängt. Beide Funktionen können
auch von mehreren Klassen oder auch in Prozeduren benutzt werden. Insofern
macht der zusätzliche Header in meinem Fall Sinn denke ich. Hab ich auf
Dietmer ja auch schon geantwortet.
mfg Lars D.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Thu Feb 16, 2006 1:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
Jirka Klaue wrote:
| Quote: | Dietmar Kuehl:
Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
Das wirft aber die Frage auf, warum man sowas überhaupt in mehrere Klassen
aufteilt.
|
Nur weil sie voneinander abhängen, heißt das natürlich noch nicht,
dass sie die gleiche Klasse sind! Zum Beispiel ist eine 'std::list<T>'
kein 'std::list<T>::iterator', aber die Klassen hängen effektiv
voneinander ab. Es ist nicht ungewöhnlich, dass mehrere Klassen
nur gemeinsam sinnvoll einsetzbar sind.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Feb 16, 2006 1:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen ge ht nicht |
|
|
Dietmar Kuehl wrote:
| Quote: | Jirka Klaue wrote:
Das wirft aber die Frage auf, warum man sowas überhaupt in mehrere Klassen
aufteilt.
Nur weil sie voneinander abhängen, heißt das natürlich noch nicht,
dass sie die gleiche Klasse sind! Zum Beispiel ist eine 'std::list<T>'
kein 'std::list<T>::iterator', aber die Klassen hängen effektiv
voneinander ab. Es ist nicht ungewöhnlich, dass mehrere Klassen
nur gemeinsam sinnvoll einsetzbar sind.
|
Abgesehen davon benötigt man neben den als Teil eines Interfaces
dokumentierten Klassen noch häufig interne Hilfsklassen,
wie z.B. _List_node<T> im Fall der Implementierung von std::list<T>
in der gcc-Standardbibliothek.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
amanjit.singh.gill@google Guest
|
Posted: Sat Feb 18, 2006 10:21 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
| Quote: | Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
|
Transparentere Darstellung der Klassenhierarchie ist für mich
persönlich ein Grund. D.h. Ordnerhierarchie = namespacehiearchie,
EventHandler.cpp und EventHandler.h etc)...
-> Fileexploreransicht entspricht somit Klassenhierarchie (falls keine
IDE oder tags vorhanden ist). Aber Geschmäcker.. .you know...
Cheers
Amanjit Gill
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Dietmar Kuehl Guest
|
Posted: Mon Feb 20, 2006 9:06 am Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
amanjit.singh.gill (AT) googlemail (DOT) com wrote:
| Quote: | Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
Transparentere Darstellung der Klassenhierarchie ist für mich
persönlich ein Grund. D.h. Ordnerhierarchie = namespacehiearchie,
EventHandler.cpp und EventHandler.h etc)...
-> Fileexploreransicht entspricht somit Klassenhierarchie (falls keine
IDE oder tags vorhanden ist). Aber Geschmäcker.. .you know...
|
Was hat die Klassenhierarchie mit dem zu tun, was ich gesagt habe?
Normalerweise habe ich einzelne Header für jede Klasse eine Hierarchie.
Allerdings definiere ich normalerweise z.B. die Iteratoren eines
Containers in dem selben Header, wie den Container. Analog für diverse
andere Klassen, die zusammengehören.
Die Klassen in einer Klassenhierarchie hängen üblicherweise nicht
voneinander ab: man kann normalerweise die Basisklasse ohne die
Kenntnis der abgeleiteten Klassen verwenden, auch wenn es sein kann,
dass man die Basisklasse selbst garnicht instanziieren kann, weil sie
abstrakt ist. Wennn die Klassen innerhalb einer Klassenhierarchie
von einander abhängen (anstatt, dass nur die abgeleiteten Klassen von
der Basisklasse abhängt, aber nicht umgekehrt), dann hat man
normalerweise ein Problem.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.eai-systems.com> - Efficient Artificial Intelligence
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
amanjit.singh.gill@google Guest
|
Posted: Mon Feb 20, 2006 2:06 pm Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht |
|
|
| Quote: | Allerdings verwende ich normalerweise je ein
Header-File für zusammengehörige Klassen, die von einander abhängen:
wozu soll man es in mehrere Header aufteilen, wenn man die Klassen
eh nur zusammen verwenden kann...
[..]
Transparentere Darstellung der Klassenhierarchie ist für mich
persönlich ein Grund. D.h. Ordnerhierarchie = namespacehiearchie,
Was hat die Klassenhierarchie mit dem zu tun, was ich gesagt habe?
|
Gut, ich meinte das jede Klasse ne Datei kriegt. iostream operator
oder ähnliches (inner classes) die echt an der Klasse kleben sind
natürlich in der selben Datei. Aber wenn ich ne Klasse suche, ist es
für _mich_ besser, wenn es Klasse.h und Klasse.cpp gibt. So hab ich
mit der speedbar in emacs nen sourcecode browser - und so kommen wir
zur klassenhierarchie.
| Quote: | Die Klassen in einer Klassenhierarchie hängen üblicherweise nicht
voneinander ab:
|
Diese Aussage ist jetzt auch sehr allgemein formuliert, so dass es
schwer ist konkret zu antworten. Wenn ich in einem konkreten Beispiel
eine gelayerte Architektur verwende (POSA, Volume 1) und nach Lakos
(Large scale c++ dev) versuche die Abhängigkeiten zu minimieren, so
entspricht - wenn ich es denn so will - ein Layer in POSA "der Tiefe
meines Namespaces" (konnte das nicht besser ausdrücken, sorry). Das
hat natürlich Pro und Contra, aber es ist nunmal ein gangbarer Weg.
das heisst z.b.
textwrite::gui (layer 1 - GUI Views)
textwrite::control (layer2 - GUI Controller, UI logik)
textwrite::engine::parser (layer3)
textwrite::engine::lexer
textwrite::engine::lang
textwrite::engine::tags
textwrite::engine::doc
textwrite::engine::print
textwrite::io (layer 4)
textwrite::io::import,
textwrite::io::export
textwrite::io::file
textwrite::io::db
Das ist so ein aus-dem-stehgreif Layer a la POSA Vol.1 (Ich bin ein
POSA ). Auf jeden Fall hängen die Klassen innerhalb der Namespaces
nur von Layer unterhalb ihnen ab (mal abgesehen von
standardbiblotheken). wenn sie "nach oben" wollen, so muss es einen
Callback Mechanismus geben, d.h. Listener oder Signal/Slot oder
ähnliches. Primär wird versucht, für die public Klassen der
jeweiligen
Namespaces ABCs (falls performance kein thema ist) oder Facades zu
verwenden. Wie gesagt, Entwurfssache ist immer auch Geschmackssache.
Ich denke bei Frameworks (Trees of Classes) ist das anders, dort ist
ableiten und spezialisieren die Vorgehensweise, OK manch einer mag nur
das als "objektorientiert" ansehen, aber C++ unterstützt ja mehrere
Paradigmen.
Tschoe,
Amanjit Gill
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|