Iterator Problem
-
dosunmu schrieb:
ein list<A*> und list<B*> sind zwei völlig verschiedene Dinge
ich meinte eine list<B*> und list<B2*>.
Noch ein nur nur halbe Sätze Zitierender. Mit dem Verzicht auf Nebensätze ich beginnen muss.
-
@Camper
Sry, ich dachte das war auf mein Beispiel bezogen.Nochmal zu meiner Frage von oben, kann mir wer erklären wie ich das mit den dereferenzierten Iteratoren bei meiner for Schleife mache.
-
dosunmu schrieb:
kann mir wer erklären wie ich das mit den dereferenzierten Iteratoren bei meiner for Schleife mache.
Was meinst du mit "das"? Casten? Das kann dir mit Sicherheit jemand erklären.
-
Ja, casten meine ich.
-
B2* b2 = static_cast<B2*>( *iter );Aber wie auch Andere hier rieche ich ein Designproblem.
-
Aber wie auch Andere hier rieche ich ein Designproblem.
Und welches?
-
dosunmu schrieb:
Und welches?
Keine Ahnung. Du hast ja nicht geschrieben, warum du Zeiger auf B2-Objekte in einer Liste von B-Zeigern ablegst. Der Cast auf eine abgeleitete Klasse ist ganz allgemein ein Indiz für ein Designproblem. Wenn du B2-Objekte nicht wie B-Objekte behandeln kannst (obwohl die public-Vererbung eine "ist ein"-Beziehung ausdrücken sollte), warum stecken sie dann in einer B*-Liste?
Du musst schon verraten, was du dir dabei gedacht hast.
-
Ich hoff ich kann so einigermaßen erklären:
Ich habe am Anfang nur die Klasse A gehabt die eine Liste und ein paar Methoden enthält. Diese Liste speichert Zeigerobjekte der Klasse B. Das hat alles geklappt(sprich die Liste mit Iteratoren durch zu gehen).
Jetzt brauchte ich aber noch eine andere Klasse die Zeigerobjekte einer erweiterten B Klasse in ihrer Liste speichern sollte.Die erweiterte B Klasse nannte ich B2 und lies sie von der B Klasse erben.
Aufgrund das B eine Vaterklasse von B2 ist habe ich mir einfach gedacht, das ich von der Klasse A einfach eine Klasse A2 ableiten kann und dadurch diese Liste, welche Objektzeiger von B aufnehmen kann, vererbt bekomme. Und aufgrund des Ersetzungprinzips dachte ich mir das ich jetzt anstatt der Basisklassenobjekte auch der abgeleiteten Klassen verwenden kann.Das ich B2* Objekte in diese Liste speichern kann geht ja anscheinend, jedoch habe ich Schwierigkeiten den Iterator<B2*> auf diese list<B*>, die jetzt B2* Objekte enthält, anwenden zu lassen .
-
dosunmu schrieb:
Ich habe am Anfang nur die Klasse A gehabt die eine Liste und ein paar Methoden enthält. Diese Liste speichert Zeigerobjekte der Klasse B. Das hat alles geklappt(sprich die Liste mit Iteratoren durch zu gehen).
Jetzt brauchte ich aber noch eine andere Klasse die Zeigerobjekte einer erweiterten B Klasse in ihrer Liste speichern sollte.Die erweiterte B Klasse nannte ich B2 und lies sie von der B Klasse erben.
Aufgrund das B eine Vaterklasse von B2 ist habe ich mir einfach gedacht, das ich von der Klasse A einfach eine Klasse A2 ableiten kann und dadurch diese Liste, welche Objektzeiger von B aufnehmen kann, vererbt bekomme.Solange du nur von A und B redest, kann man dazu nicht viel sagen. Es hat aber den Anschein, dass du Vererbung benutzt, um Code wiederverwenden zu können. Das ist eigentlich nicht Sinn der Sache.
Ich würde da eher aus A ein Template machen, mit dem Typ B/B2 als Templateparameter. Aber solange du nicht ein wenig konkreter ist, ist das nur ein Schuss ins Blaue.
Und aufgrund des Ersetzungprinzips dachte ich mir das ich jetzt anstatt der Basisklassenobjekte auch der abgeleiteten Klassen verwenden kann.
Von welchem "Ersetzungsprinzip" sprichst du? Vom LSP?
Das ich B2* Objekte in diese Liste speichern kann geht ja anscheinend,
Logisch. Ein B2 ist ein B, darum ist ein B2* implizit in B* konvertierbar. Die statische Typinformation geht dabei allerdings verloren.
jedoch habe ich Schwierigkeiten den Iterator<B2*> auf diese list<B*>, die jetzt B2* Objekte enthält, anwenden zu lassen .
Wie du hier schon mehrfach lesen konntest, ist es egal, in welcher Beziehung B und B2 stehen, eine list<B2*> ist keine list<B*>. Darum kannst du auch nicht die Iteratortypen mischen.
-
Solange du nur von A und B redest, kann man dazu nicht viel sagen.
Es handelt sich dabei um einen lokalen Terminkalender(A) den jeder Mitarbeiter besitzt. In diesen Terminkalender können Termine(B) eingetragen werden.
Dann gibt es aber auch noch einen zentralen Terminkalender(A2) der alle vorhandenen Termine(B2) speichert. Er ist dafür da es zu keinen überschneidungen zwischen den Terminressourcen(Raum,Gerät...)kommen kann.
Die Termine(B2 und
unterscheiden sich durch ein Attribut das ich bei Termine(B2) noch dazugeben muss.
Im lokalen Terminkalender habe ich jetzt eine Liste angelegt wo ich die Termine(B) speichern kann. Und da das ja für den zentralen Terminkalender und seine Termine ähnlich gehen soll, lass ich einfach diese beiden erben. Habe ich damit keine Untertypenbeziehungen?Darum kannst du auch nicht die Iteratortypen mischen.
Schade, das es nicht geht. Kann man das denn nie gebrauchen?