//Código de las páginas 481-482

class ContenedorOperandos {
private:
	vector<Operando*> VectorOperandos;

public:
	// Crea las intrucciones
	ContenedorOperandos (Interprete *i) : VectorOperandos(4) {
		VectorOperandos[0] = NULL;
		VectorOperandos[1] = new Inmediato(i);
		VectorOperandos[2] = new OpMemoria(i);
		VectorOperandos[3] = new OpRegistro(i);
	}

	// Elimina las instrucciones
	~ContenedorOperandos () {
		for (unsigned i = 1; i < VectorOperandos.size(); i++) {
			delete VectorOperandos[i];
		}
	}

	Operando * Obtener( TFormatoOp f) throw(FormatoOperandoInvalido) {
		Operando * rOperando;		
		try {
			rOperando = VectorOperandos.at(f.Codigo);
			rOperando->PonFormato(f);
		} catch (out_of_range e) {
			throw FormatoOperandoInvalido();
		}
		return rOperando;
	};
};

class ContenedorInstrucciones {
private:
	vector<Instruccion*> VectorInstrucciones;

public:
	// Crea las intrucciones
	ContenedorInstrucciones(Interprete *i) : VectorInstrucciones(9) {
		VectorInstrucciones[0] = NULL;
		VectorInstrucciones[1] = new Mueve(i);
		VectorInstrucciones[2] = new Suma(i);
		VectorInstrucciones[3] = new Resta(i);
		VectorInstrucciones[4] = new Compara(i);
		VectorInstrucciones[5] = new Salta(i);
		VectorInstrucciones[6] = new Entrada(i);
		VectorInstrucciones[7] = new Salida(i);
		VectorInstrucciones[8] = new Fin(i);
	}

	// Elimina las instrucciones
	~ContenedorInstrucciones() {
		for (unsigned i= 1; i < VectorInstrucciones.size(); i++) {
			delete VectorInstrucciones[i];
		}
	}

	Instruccion * Obtener( TFormatoInst f) throw(FormatoInstruccionInvalido) {
		Instruccion * rInstruccion;		
		try {
			rInstruccion = VectorInstrucciones.at(f.Codigo);
			rInstruccion->PonFormato(f);
		} catch (out_of_range e) {
			throw FormatoInstruccionInvalido();
		}
		return rInstruccion;
	};
};
