14. Miembros estaticos c++
Variables/Funciones estaticas
Dentro de las clases podemos definir atributos y metodos estaticos.
Tienen de particular que son accesibles sin necesidad de definir una clase
y que su valor es EL MISMO en todas los objetos que se vayan creando de una clase.
Es como una variable global de una clase.
Con este ejemplo se ve su uso, y de paso se revisa el tema de punteros a funciones.
(si, has leido bien).
Se recomienda probar y ejecutar para comprobar el funcionamiento de las variables estaticas.
Con este ejemplo se ve su uso, y de paso se revisa el tema de punteros a funciones.
(si, has leido bien).
/** * Soldado.hpp * Clase que define el objeto soldado muestra el uso de variables estaticas * y metodos estaticos. Todo lo estatico escapa del ambito de la clase y puede * ser invocado desde el exterior * * Pello Xabier Altadill Izura * */ #include <iostream.h> class Soldado { public: // constructores Soldado(); Soldado(char *nombre, int unidad); // destructor ~Soldado(); // copia Soldado(Soldado const &); // get/set char *getNombre () const { return this->nombre; } void setNombre (char *nombre) { this->nombre = nombre; } int getUnidad () const { return this->unidad; } void setUnidad (int unidad) { this->unidad = unidad; } void matar() const; void darOrden (char *orden) const; // metodo que toma como parametro una funcion void ejecutaAccion ( void (*accion) (int,int)); static int TotalSoldados; // variable estatica! static int TotalBalas; // variable estatica! // Funciones estaticas static int getTotalSoldados () { return TotalSoldados; } static int getTotalBalas () { return TotalBalas; } private: char *nombre; int unidad; };Y su implementacion.
Se recomienda probar y ejecutar para comprobar el funcionamiento de las variables estaticas.
/** * 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(); cin >> i; 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; }Bueno, y con esto ya son dos semanas dandole al c++ y aprendiendo su abc...