Me gustaría administrar un conjunto de objetos de clases derivados de una clase de interfaz compartida en un contenedor común.¿Cuál sería la forma más segura de almacenar objetos de clases derivados de una interfaz común en un contenedor común?
Para ilustrar el problema, digamos que estoy construyendo un juego que contendrá diferentes actores. Llamemos a la interfaz IActor
y obtenga Enemy
y Civilian
de ella.
Ahora, la idea es tener mi juego bucle principal sea capaz de hacer esto:
// somewhere during init
std::vector<IActor> ActorList;
Enemy EvilGuy;
Civilian CoolGuy;
ActorList.push_back(EvilGuy);
ActorList.push_back(CoolGuy);
y
// main loop
while(!done) {
BOOST_FOREACH(IActor CurrentActor, ActorList) {
CurrentActor.Update();
CurrentActor.Draw();
}
}
... o algo por el estilo. Este ejemplo, obviamente, no funcionará, pero esa es más o menos la razón por la que estoy preguntando aquí.
Me gustaría saber: ¿Cuál sería la forma mejor, más segura y de más alto nivel para administrar esos objetos en un contenedor heterogéneo común? Conozco una variedad de enfoques (Boost :: Any, void *, clase de controlador con boost :: shared_ptr, Boost.Pointer Container, dynamic_cast) pero no puedo decidir cuál sería el camino a seguir aquí.
También me gustaría hacer hincapié en que quiero alejarme lo más posible de la administración manual de la memoria o los punteros anidados.
Ayuda muy apreciada :).
le gustó la forma en que usa for_each –
¿Puede explicar su for_each y cómo la usaría con BOOST_FOREACH? – Svenstaro
std :: for_each (I1, I2, Acción).Aplica la Acción a todos los valores (en este caso llama al método updateDraw) en el rango entre I1 e I2 (sin incluir I2). Donde I1, I2 son iteradores. Ver: http://www.sgi.com/tech/stl/for_each.html –