Klassen in std::vektor organisieren?
-
Hallo,
Ich hab ein Designproblem:
In einer "Welt" gibt es mehrere Dinge, etwa Würmer und Bäume, die durch Objekte repräsentiert werden. Diese Objekte werden etwa mittels:class objekt; class baum : object; class wurm : object;Nun will ich diese Objeket in einer Liste speichern, dem Obj_Manager:
std::vector<objekt*>;Nun will ich diese Regelmäßig, etwa auf Tastendruck (kein Problem), alle einmal "ausgeben" (quasi einzeiliger Statusbericht)... (Also mit Iteratoren...)
Nun zum Problem:
Die Würmer sollen einen Namen erhalten, und dynamisch erstellt und gelöscht (nach Name) werden können, gleiches gilt für bäume, diese haben allerdings keinen Namen, hier soll ein zufälliger Baum gelöscht werden.Kann ich das ganze einfach mit einem std::vector lösen, oder muss/soll ich mehrere anlegen? Was soll ich tun, wenn später weitere "Typen" (wie Wurm oder Baum) dazukommen?
Ihr habt bestimmt gute Ideen/Schlagworte/Stichworte für mich...Danke im voraus, Abahatschi
-
Grundsätzlich mag das arbeiten über eine allgemeine Objektbasisklasse sehr bequem erscheinen, aber selbst Sprachen in denen das ursprünglich stark praktiziert wurde (Java/C#) trennen sich nicht ohne Grund immer mehr von solchen Konstrukten (Thema Generiks/Templates...).
Eine gemeinsame Datenhaltung von unterschiedlich anzusprechenden Objekten ist in der Regel immer ein Zeichen schlechten Designs, und sollte vermieden werden.
Sinnvoll ist ein solches Konstrukt nur wenn es wirklich so viele Gemeinsamkeiten gibt das man nahezu alle Fälle über eine gemeinsame Basisklasse abbilden kann. Ableitung Sollte man nur dort verwenden wo man wirklich sagen kann <abgeleitetes Klasse> ist <Basisklasse> also z.b. "Kreis" ist ein "Grafikobjekt" - und wo man mit den Funktionen (ggf. virtual) der Basisklasse die üblichen Fälle abbilden kann.
Dies ist bei dir nicht gegeben, hier wären daher mindestens 2 getrennte Datenspeicher sinnvoll (weitere Anmerkung am Rande: es heißt std::vector). Und Zeiger in Listen - ich hoffe du denkst daran selbst aufzuräumen (delete) .
cu André
-
Ok, danke, werd dann jetzt mal ein wenig planen...
