"Rekursive" Beziehungen zwischen Klassen
-
@drakon:
Für sowas gibt's doch u.A. die C++ FAQ Lite:http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11
-
hustbaer schrieb:
@drakon:
Für sowas gibt's doch u.A. die C++ FAQ Lite:http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.11
Jap. Ich bin normalerweise durchaus ein Freund von "nicht-alles-wiederholen-was-schon-1000-andere-gemacht-haben".
Aber ich kannte die Seite zwar, aber ich habe sie nie durchgelesen und bei diesem Abschnitt zumindest darf ich behaupten, dass ich einiges mehr an Inhalt biete.
Das das ganze auf Deutsch ist, denke ich hilft auch einigen, die das dort lesen.
-
Ich als der Hilfesuchende finde beide hilfreich.
drakons Seite liefert schöne Verallgemeinerungen und Hintergrundinfos, also das "Warum". Das FAQ wiederum erklärt alles wunderbar Schrittweise anhand von Beispielen mit den verschiedenen Ansätzen, also "for dummys" ...Wenn man also nur schnell ne Lösung haben möchte(oder verschiedene) und den praktischen Nutzen direkt draus ziehen möchte, würde ich das FAQ empfehlen. Wenn man dagegen etwas lernen möchte, also so, dass man vlt. auch ne mehr oder weniger qualifizierte Erklärung an nen Dritten abgeben kann, fänd ich die erste Seite besser;)
Fazit ... beides Klasse und sehr hilfreich. Schön bei der Zweiten ist auf jeden Fall, dass man nicht mehr selbst denken muss^^
-
Naja. Man kann bei mir durchaus auch einfach zur Lösung skippen..
Aber das war durchaus mein Hintergedanke da noch eine Eklärzung und das wieso zu liefern, anstatt einfach nur wies geht. Ich denke wenn man versteht, warum das so geht, dann wird einem einiges viel klarer. Ansonsten ist das eher nach dem Try/Error Prinzip, was ich nicht so toll finde.

EDIT:
Vor allem der letzte Teil, wo was jetzt nötig ist wird oftmals falsch erklärt und halte ich für wichtig.
-
Jepp, bin auch froh zuerst deine Seite bekommen zu haben. Hätt ich die Andere zuerst bekommen, hätt ich vermutlich nie weiter nach dem "Warum" gefragt ... auch aus Faulheit^^
-
@drakon:
Vielleicht solltest du deinen Artikel noch um das Thema "deleting incomplete types"/"checked delete" ergänzen.
Das ist eine Falle, in die man (vor allem, aber nicht nur) als Anfänger schnell tappen kann, wenn man anfängt Forward Declarations zu verwenden.Erklärung z.B. hier:
http://www.boost.org/doc/libs/1_41_0/libs/utility/checked_delete.htmlIMO muss das bei dem Thema erwähnt werden, wenn man mehr als eine oberflächliche Erklärung zu dem Thema abgeben möchte.
-
Danke für den Hinweis!
Allerdings hat eine ausführliche Erklärung leider keinen Platz mehr, darum habe ich einfach einen Link zu boost eingebaut.
-
Wie, keinen Platz

Webseiten werden normalerweise von selbst grösser, wenn man mehr Inhalt reinschreibt. Wusstest du das nicht?

-
hustbaer schrieb:
Wie, keinen Platz

Webseiten werden normalerweise von selbst grösser, wenn man mehr Inhalt reinschreibt. Wusstest du das nicht?

Das senden des Requests ist zu gross.
Als ich die Seite programmiert habe, habe ich nie mit so grossen Texten getestet, aber POST hat halt seine Grenzen und die habe ich eben nicht berücksichtigt.
(Darum ist auch der Eintrag über C++0x und VS in 3 Teilen. ;))
Ist auf der ToDo Liste, aber naja. Atm habe ich keine Muse um an der Seite weiter zu entwickeln.
-
Da ich irgendwie das Gefühl nicht loswerde, dass mein neues "Problem" auch noch etwas mit dem Alten zutun hat ... ^^
Also, um die Erklärung kurz zu halten, ich verwende das Strategy Pattern und habe jede Klasse auf ner Header und ner Source Datei aufgeteilt.
In der Headerdatei des Kontextes binde ich eine abstrakte Strategieklasse ein (naja, also außer zwei Methoden sind auch hier alle bereits realisiert, nutzen jedoh die Nichtrealisierten, was ja soweit ok is^^).
Und nun beginnt der Spaß... Wenn ich die konkreten Klassen in der Source-Datei des Kontextes einbinde, ist scheinbar alles ok. Wenn ich sie aber direkt im Header versuche einzubinden, bekomm ich folgende Fehlermeldung:
In file included from Model/GamePice.h:17,
from Model/GamePiceMovement.h:13,
from Model/KingMovement.h:11,
from Model/KingMovement.cpp:8:
Model/MenMovement.h:16: error: expected class-name before '{' token
Weiß nich, ob Ihr damit was anfangen könnt ... aber ich kann's nich^^
Also. GamePice ist der Kontext, GamePiceMovement die abstrakte Strategie und KingMovement sowie MenMovement sind die konkreten Strategien.
Ich frage, da ich bisher annahm, dass ich das ganze Einbinden ganz einfach immer schön in die Headerdateien auslagern kann, so dass auch immer schön alles zusammen ist. Naja, nun ist das "Warum" interessant^^
Da's mir gerade zu aufwändig ist den Fehler nochmal mit neuen Beispielcode zu reproduzieren, hier das, was ich bisher habe:
http://rapidshare.com/files/328163590/Dame.rar.html
MD5: 053F86488966E57C5E601DDDAE3EB326Wie Ihr euch wohl denken könnt, handelt's sich um nen Damespiel. Der ganze grafische Schnickschnack wird von mir erst draufgebappt, wenn alles Andere steht. Also nicht wundern, dass es nichts zu sehen gibt. Hab ja auch gerade erst angefangen und noch keine Tests (außer für "Location") gemacht. Aber darumg geht's ja auch gerade nich^^
Edit: Achso, das wird nun nicht zu kompilieren gehen. Stattdessen solltet Ihr den geposteten Fehler bekommen. Damit's läuft einfach die includes von MenMovement.h und KingMovement.h nach GamePice.cpp verschieben. Dann funzt's ... warum auch immer^^
-
Ehm. Ja ich denke schon, dass es was mit dem zu tun hat.

Das ist ja genau der Sinn der Sache die Implementierungen in die .cpp zu verschieben. Und vorher lediglich die Vorwärtsdeklarationen zu benutzen. Ich habe mir jetzt nicht alles genau angeschaut, aber ich denke, dass es genau so zu einem zyklischen include kommt (wenn halt auch vlt. versteckt über mehrere Dateien).
Das in einem Header zu machen ist eh nicht sinnvoll, da du nicht jede Klasse neu komipilieren willst, die nur den Header benutzt, wenn du die Schnittstelle gleich lässt und die Implementierung änderst. Das ist das, was ich in meinem Beitrag anspreche von wegen Abhängigkeiten vermeiden.
-
Hm, scheinbar ist's schon zu spät^^
Nagut, dann bastel ich mir nun also die Regel ...
Definition einer Klasse wie gehabt in die Headerdatei, aber sonst die benötigten Klassen nur wenn unbedingt nötig einbinden, und nach Möglichkeit lieber ne Vorwärtsdeklaration. Und alles zur Übrige und zur Implementierung Nötige wird erst in der Sourcedatei eingebunden.
... und denk wenn ich wieder munter bin noch mal drüber nach^^
Aber wenn ich so müde drüber nachdenke, klingt's sogar irgendwie gut und logisch^^
Danke nochmal

-
drakon schrieb:
hustbaer schrieb:
Wie, keinen Platz

Webseiten werden normalerweise von selbst grösser, wenn man mehr Inhalt reinschreibt. Wusstest du das nicht?

Das senden des Requests ist zu gross.
Als ich die Seite programmiert habe, habe ich nie mit so grossen Texten getestet, aber POST hat halt seine Grenzen und die habe ich eben nicht berücksichtigt.Man kann mit POST soweit ich weiss beliebig grosse Sachen hochladen.
Wenn da jemand limitiert, dann höchstens der Server. Oder dein script. (Ich meine: von HTTP aus gibt's da kein Limit.)
-
hustbaer schrieb:
Man kann mit POST soweit ich weiss beliebig grosse Sachen hochladen.
Wenn da jemand limitiert, dann höchstens der Server. Oder dein script. (Ich meine: von HTTP aus gibt's da kein Limit.)Es ist schon der Server. Muss mal schauen, ob ich da was einstellen kann, aber ich befürchte nicht..
(ist halt gehostet)