| /**
* Soldado.cpp
* Programa que implementa la clase Soldado
* 
* Pello Xabier Altadill Izura
* Compilacion: g++ Soldado.cpp -o Soldado
*/
#include "Soldado.hpp"
// Constructor
Soldado::Soldado(): nombre("Ryan"), unidad(101) {
	TotalSoldados += 1;
	TotalBalas++;
	cout << "Soldado " << nombre << " construido. Unidad: " << unidad << endl;
}
// Constructor parametrizado
Soldado::Soldado(char *nombre, int unidad) {
	
	TotalSoldados++;
	TotalBalas++;
	this->nombre = nombre;
	this->unidad = unidad;
	cout << "Soldado " << nombre << " :Soldado construido." << endl;
}
// Destructor
Soldado::~Soldado() {
	
	TotalSoldados--;
	cout << "Soldado "<< this->getNombre() << " destruido."<< endl;
}
// constructor copia
Soldado::Soldado(const Soldado & original) {
	
	nombre = new char;
	nombre = original.getNombre();
	cout << "-clase Soldado- Soldado copia creada."<< endl;
}
// metodo matar
void Soldado::matar() const {
	
	TotalBalas--;
	cout << this->getNombre() << " Matar es lo mio " << endl;
	cout << "Born to kill. paz. Es por la dualidad de Kant" << endl;
}
// metodo darOrden
void Soldado::darOrden(char *orden) const {
	cout << "Recluta patoso!" << endl; 
	cout << this->getNombre() << " unidad " << this->getUnidad() << " ordena: ";
	cout << orden << endl;
}
// metodo ejecutaAccion: ejecuta la funcion que se le pasa como parametro
void Soldado::ejecutaAccion ( void (*accion) (int,int)) {
	
	accion(5,7);
	
	cout << "Recluta patoso!" << endl; 
} 
// ATENCION IMPORTANTE: HAY QUE DEFINIR E INICIAR LAS VARIABLES ESTATICA SI NO
// el compilador nos puede poner pegas
int Soldado::TotalSoldados = 0;
int Soldado::TotalBalas = 0;
// Definimos una funcion ajena a la clase desde la cual accederemos
// a la variable estatica, con lo que se demuestra que la variable estatica
// esta fuera de la "capsula" de la clase.
void recuentoSoldados(void);
// definimos otra funcion esta para pasarsela como parametro a un metodo de la clase
void carga (int balas, int granadas);
// funcion principal
// Aqui haremos multiples pruebas...
int main () { 
	int i, resp;
	// creamos los soldados
	Soldado peloton[10];
	Soldado Hanks = Soldado("Hanks",105);
	// definicion de puntero de funcion:
	void (*funcion) (int, int) = carga; 
	
	// Si hay mas de una funcion carga sera la que tenga los mismos parametros
	// y el mismo tipo de retorno
	// llamamos a la funcion recuento
	recuentoSoldados();
	
	peloton[0].darOrden("Todos en formacion.");
	
	peloton[2].darOrden("Canta el colacao!");
	
	// recorremos los 10 soldados y hacemos algo dependiendo de la entrada
	// Si matamos unos cuantos modificaremos la variable de TotalSoldados
	
	for (i = 0; i < 10 ; i++) {
	
		cout << "Elije 0 o cualquier otro numero: " << endl;
		cin >> resp;
		
		if (resp == 0) {
			
			// matamos al soldado
			peloton[i].~Soldado();
		} else {
			
			peloton[i].matar(); // tiramos una bala
		}
		
		// Invocamos el metodo estatico?
		// es un acceso DIRECTO sin necesitar un objeto definido
		resp = Soldado::getTotalSoldados();
		cout << "Cuantos quedan? " << resp << endl;
	}//for
	// accedemos directamente a variable estatica
	cout << "Total balas antes de recarga: " << 
	Soldado::TotalBalas << endl;
	
	// hacemos una recarga:
	Hanks.ejecutaAccion(funcion);
	
	// llamamos a la funcion recuento
	recuentoSoldados();
	return 0;
}
// implementacion de la funcion recuento
// muestra el numero de soldados. Podemos acceder DIRECTAMENTE a la variable statica
void recuentoSoldados () {
	
	cout << "Cuantos soldados quedan vivos? " << endl;
	cout << "En total: " << Soldado::TotalSoldados << " soldados"<< endl;
	
	cout << "Municion? " << endl;
	cout << "En total: " << Soldado::getTotalBalas() << " balas" << endl;
}
// funcion que carga municion del peloton
void carga (int balas, int granadas) {
	
	cout << "Cargando balas: " << balas << endl;
	
	Soldado::TotalBalas += balas ;
	
	cout << "Cargando granadas: " << granadas << endl;
} |