C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Vorwärtsdeklaration von Strukturen geht nicht

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Lars T. Droegemueller
Guest





PostPosted: Tue Feb 14, 2006 5:06 pm    Post subject: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote



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 Wink).
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. Wink
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





PostPosted: Tue Feb 14, 2006 6:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote



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





PostPosted: Wed Feb 15, 2006 12:06 am    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote



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





PostPosted: Wed Feb 15, 2006 4:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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





PostPosted: Wed Feb 15, 2006 7:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geh t nicht Reply with quote

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





PostPosted: Wed Feb 15, 2006 7:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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 Wink),
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





PostPosted: Wed Feb 15, 2006 8:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geh t nicht Reply with quote

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





PostPosted: Thu Feb 16, 2006 1:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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





PostPosted: Thu Feb 16, 2006 1:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen ge ht nicht Reply with quote

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





PostPosted: Sat Feb 18, 2006 10:21 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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





PostPosted: Mon Feb 20, 2006 9:06 am    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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





PostPosted: Mon Feb 20, 2006 2:06 pm    Post subject: Re: Vorwärtsdeklaration von Strukturen geht nicht Reply with quote

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 Wink). 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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.