Fábrica genérica en C ++ [duplicado]
Esta pregunta ya tiene una respuesta aquí:
¿Hay alguna forma de instanciar objetos de una cadena que contenga su nombre de clase? @ 9 respuestasEstoy trabajando en un juego y estoy tratando de implementar una forma inteligente de crear objetos npc en C ++ analizando un archivo de texto.
Actualmente, esto está codificado en un objeto Factory. Me gusta esto
IActor * ActorFactory::create(string actortype, Room * r, string name, int hp)
{
if(actortype == "Troll")
{
return new Troll(r, name, hp);
}
if (actortype == "Dragon")
{
return new Dragon(r, name, hp);
}
// ... and so on
throw "Can't recognize type '"+actortype+"'.";
}
Esta es, en mi opinión, una forma muy fea de hacerlo. Dado que (entre otras cosas) rompe la Principio abierto / cerrado.
Soy educado en Java, y en Java haría algo como hacer que cada IActor informe su nombre de clase y tipo de clase al ActorFactory al comienzo de la ejecución del programa. Luego, la fábrica almacenaría la relación en un mapa y luego podría buscar fácilmente qué correlaciones asigna a qué objeto y luego podría instanciarla fácilmente.
Edit: También me gustaría tener la capacidad de llamar al constructor con un número variable / tipo de argumentos.
¿Cómo se haría esto en C ++? ¿Se puede hacer