Recuerden que tienen un ejemplo de std::map aquí, un ejemplo de std::shared_ptr aquí y un ejemplo de cómo invocar al constructor del tipo base aquí (tendrán que definir el destructor para cada tipo derivado).
La lectura de una cantidad arbitraria de instrucciones la pueden hacer de una forma similar a la siguiente:
std::vector<std::shared_ptr<instruccion>> preprocesa(std::istream& entrada) {
//...
std::string tipo_instruccion;
while (entrada >> tipo_instruccion) { // mientras puedan leer una palabra
// aquí pueden hacer un if-else-if-else para determinar qué más de la instrucción deben leer según su tipo
}
//...
}
Además, para fines del reporte de errores, las instrucciones se numeran implícitamente según vengan en la entrada (la primera instrucción leída es la 1, la segunda instrucción leída es la 2, etc) así que deben agregar un contador en alguna parte.int n = 5; // forma 1 std::ostringstream oss; oss << n << ": hola"; std::string s1 = oss.str( ); // forma 2 std::string s2 = std::to_string(n) + ": hola";