Ich möchte eine Reihe von Objekten von Klassen verwalten, die von einer gemeinsamen Interface-Klasse in einem gemeinsamen Container abgeleitet sind.Was wäre der sicherste Weg, Objekte von Klassen zu speichern, die von einer gemeinsamen Schnittstelle in einem gemeinsamen Container abgeleitet sind?
Um das Problem zu veranschaulichen, lasst uns sagen, ich baue ein Spiel, das verschiedene Akteure enthalten wird. Lassen Sie uns die Schnittstelle IActor
aufrufen und davon Enemy
und Civilian
ableiten.
Nun ist die Idee, mein Spiel Hauptschleife der Lage sein, dies zu tun:
// somewhere during init
std::vector<IActor> ActorList;
Enemy EvilGuy;
Civilian CoolGuy;
ActorList.push_back(EvilGuy);
ActorList.push_back(CoolGuy);
und
// main loop
while(!done) {
BOOST_FOREACH(IActor CurrentActor, ActorList) {
CurrentActor.Update();
CurrentActor.Draw();
}
}
... oder etwas in diese Richtung. Dieses Beispiel wird offensichtlich nicht funktionieren, aber das ist ziemlich genau der Grund, warum ich hier frage.
Ich würde gerne wissen: Was wäre die beste, sicherste, höchste Art und Weise, um diese Objekte in einem gemeinsamen heterogenen Container zu verwalten? Ich kenne eine Vielzahl von Ansätzen (Boost :: Any, void *, Handler-Klasse mit boost :: shared_ptr, Boost.Pointer Container, dynamic_cast), aber ich kann mich nicht entscheiden, welcher Weg so gehen würde.
Auch möchte ich betonen, dass ich so weit wie möglich von der manuellen Speicherverwaltung oder verschachtelten Zeigern entfernt bleiben möchte.
Hilfe sehr geschätzt :).
gefiel die Art, wie Sie for_each verwendet –
Können Sie erklären, Ihre for_each und wie Sie es mit BOOST_FOREACH verwenden würden? – Svenstaro
std :: for_each (I1, I2, Aktion).Wendet die Aktion auf alle Werte an (in diesem Fall ruft die Methode updateDraw auf) im Bereich zwischen I1 und I2 (ohne I2). Wo I1, I2 sind Iteratoren. Sehen Sie: http://www.sgi.com/tech/stl/for_each.html –