Tutorial de C++ - Miembros estaticos

15 - Miembros estaticos

[editar]
Tutorial creado por Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/
28 de Febrero de 2006
Quereis ver un miembro no estatico? (< !-- nota docbook: quitar chorradas antes de publicar -->) 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).

|| / * 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 * */ using namespace std; #include <iostream> 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(); 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...
[editar]

23 opiniones

yery cruz

12345
DamiaN

Mal exlicado :S,
no dice nada

agan algo de servicio por favor no mas estupidos
alegoria

cuando uno va a esplicar de progamacion primero se esplican los concepto, delas intrucciones,para que el estudiante sepa lo que se dice o de lo que se esta hablando, si es que esta pagina intructiva, sinoo no pongan estos ejemplo pues son tan astracto para los principiates que lo que hacen es asustarlos y seban , para esto de maestro, hay que ser humilde yno creer que como ya yo se no me importa lo que venga, no tomen esto, como algo mejoren, mejoren,mejoren, los quiero mucho migel.
Sobre nombre de array.

Hola, peter. Respecto a tu primera pregunta sobre cómo nombrar lo que en el código aparece como "array" en inglés, te puedo decir que no es correcta ninguna de las dos opciones que ofreces. Si se usa "arrays" se está españolizando la palabra inglesa "array". No muy conveniente, porque en español ya existe la palabra adecuada para ese concepto: "vector". De todos modos, españolizar una palabra inglesa en argot técnico no es tan grave como usar la palabra española traducida según una acepción inglesa incorrecta. Nunca se debería usar "arreglo".
1 2 3 4 5 | siguiente >

Tutoriales relacionados con 'Tutorial de C++'

Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de... Más »
Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
Si tuviera que buscar un adjetivo para calificar a Sendmail, pensaría en "excesivo". Excesivo puesto... Más »
La red telefónica básica se creó para permitir las comunicaciones de voz a distancia. Esto... Más »
Bienvenidos al manual de HTML de Indaya.A través de todos estos capítulos vamos a descubrir... Más »

Autor y licencia de 'Tutorial de C++'


Tutorial de Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/ CopyLeft
Este documento se cede al dominio publico.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.