Ver la versión completa : c++, funciones estáticas y recuento de instancias
¿Como y para que sirven los métodos estáticos en c++? en Java es para llamarlas sin tener que instancias un objeto de dicha clase, pero en c++ no parece funcionar así.
Por otro lado me han pedido un método estático que cuente el número de objetos instanciados actualmente de dicha clase. ¿Cómo se hace eso?
DarkDijkstra
03/06/2009, 16:35
Pues si no me equivoco, en C++ funcionan para lo mismo que en java... para poder ser llamados sin necesidad de crear un objeto de dicha clase...
Para "llevar la cuenta" de los objetos lo más sencillo puede ser crear en dicha clase un atributo "int" estático (en principio privado, ya que nadie debería tocarlo desde fuera) y un método, también estático (pero esta vez público) que se llame get_count() o similar.
En el constructor de la clase, puedes hacer que dicho contador se incremente (ya que es estático) y así en cualquier momento puedes hacer un Nombre_de_la_clase::get_count() que te devuelva ese contador numérico.
Eso sí, recuerda que en el fichero cpp de la clase tienes que inicializar el contador a cero.
PharaOnyx
03/06/2009, 16:37
Por otro lado me han pedido un método estática que cuente el número de objetos instanciados actualmente de dicha clase. ¿Cómo se hace eso?
La idea es hacer una clase, ocultar su constructor y, en su lugar, poner un método de clase que sea el generador de instancias. Cada vez que lo llames para generar una instancia nueva sumas 1 a una variable de clase y listo. Si no me expliqué muy bien (algo bastante común :lol:), busca información sobre un patrón de diseño de software que se llama 'Singleton' :)
Saludos, Alex
La idea es hacer una clase, ocultar su constructor y, en su lugar, poner un método de clase que sea el generador de instancias. Cada vez que lo llames para generar una instancia nueva sumas 1 a una variable de clase y listo. Si no me expliqué muy bien (algo bastante común :lol:), busca información sobre un patrón de diseño de software que se llama 'Singleton' :)
Saludos, Alex
Mejor explicado imposible. Y precisamente lo que quiere pakoito es el patrón que le indicas :)
Ok, creo que lo que me fallaba era al llamar a las estáticas lo hacía con NOMBRECLASE.metodo() y no con :: :p
Lo de inicializar el contador al principio...¿alomejor hacerlo público y que se haga al comienzo del main?
PharaOnyx
03/06/2009, 16:50
Lo de inicializar el contador al principio...¿alomejor hacerlo público y que se haga al comienzo del main?
Lo puedes hacer así, pero si lo quieres hacer bien tiene que quedar oculto dentro de la clase :)
Saludos, Alex
Creas un booleano para saber si la clase esta ya "inicializada". Cuando se llame al constructor estatico del singleton comprueba ese booleano, y entonces le asigna 0 o le suma 1.
saboteur
03/06/2009, 17:03
La idea es hacer una clase, ocultar su constructor y, en su lugar, poner un método de clase que sea el generador de instancias. Cada vez que lo llames para generar una instancia nueva sumas 1 a una variable de clase y listo. Si no me expliqué muy bien (algo bastante común :lol:), busca información sobre un patrón de diseño de software que se llama 'Singleton' :)
Saludos, Alex
No hace falta ocultar el constructor y poner otro. En el propio contructor de la clase puedes comprobar el contador estático [ if(miclase::contador==0) yupii(); ] e incrementarlo o hacer lo que quieras.
Los metodos 'static' en C++, se llaman metodos de clase, y siempre se llaman clase::metodo, y dentro de ellos no puedes hacer referencia a atributos que no sean de clase (static) porque el compilador no sabe a que objeto te refieres (puede que no hayas creado ninguno).
class foo
{
public:
foo();
~foo();
...
static int numeroInstancias();
private:
int mNumeroInstancias;
};
// en el .cpp, si pones la inicializacion en el .h tendras errores en el linkador
int foo::mNumeroInstancias=0;
foo::foo()
{
++mNumeroInstancias;
}
foo::~foo()
{
--mNumeroInstancias;
}
...
int foo::numeroInstancias()
{
return mNumeroInstancias;
}
Un poco más claro asi. De todas formas les dije a los alumnos que lo inicializaran en el main y corriendo.
Un poco más claro asi. De todas formas les dije a los alumnos que lo inicializaran en el main y corriendo.
Eso no es una buena solución porque, ¿que pasa si reutilizas esa clase en otro programa y se te olvida inicializar la variable en el main?
Por eso existen los constructores y destructores, para no tener que poner foo.init() foo.uninit() ni cosas así.
Con el profesor de c++ que tenemos esas cosas no importan, los códigos son irreutilizables y todo se hace "a su manera". No buscamos lo óptimo para el programa sino que funcione sin más para aprobar.
Ocultación, .init() y demás...rien de rien.
^MiSaTo^
04/06/2009, 20:33
Con el profesor de c++ que tenemos esas cosas no importan, los códigos son irreutilizables y todo se hace "a su manera". No buscamos lo óptimo para el programa sino que funcione sin más para aprobar.
Ocultación, .init() y demás...rien de rien.
Hombre pakoito, lo suyo es que aprendas la manera "buena" (optima) de hacer las cosas ;)
Aunque tu profesor le sude todo. Yo en toda la carrera nunca he reutilizado código pero esas cosas si las teníamos en cuenta.
Ahora en el curro uff xDD no veas si reutilizo clases del tipo "Utils" y cosas así ;) (sobre todo cuando curraba en consultoras xDDDD)
El problema es que si le voy con código o algoritmos que no conoce alega falta de claridad y te carga el examen. No aprendemos c++ sino Domingo++. Si dijo que nada de gets y sets, y esto se inicializa en el main lo hago a su manera. Si no sabe escribir un enunciado sin faltas o errores ni declarar un struct bien...hay que hacerlo como él lo hizo.
^MiSaTo^
04/06/2009, 20:38
El problema es que si le voy con código o algoritmos que no conoce alega falta de claridad y te carga el examen. No aprendemos c++ sino Domingo++
Bueno eso pasa en todos lados XD
Aprendete su "c++" para aprobar la asignatura y también trata de aprender la manera "buena" de hacerlo. Cuando curres lo agradecerás ;)
Ya, ahora que he dado clase me ha tocado ir aprendiendo algunas cosas...e incluso sobre la marcha de la propia clase O.o
^MiSaTo^
04/06/2009, 20:42
Ya, ahora que he dado clase me ha tocado ir aprendiendo algunas cosas...e incluso sobre la marcha de la propia clase O.o
Mira, nunca te acostarás sin saber nada nuevo ;)
Mira, nunca te acostarás sin saber nada nuevo ;)
Tengo curiosidad por ver qué me darán en Gales de c++/c# con OpenGL :D En tres semanas lo veré, tengo que refrescarme aun más el c++ porque hay código que aun no entiendo.
^MiSaTo^
04/06/2009, 20:48
Tengo curiosidad por ver qué me darán en Gales de c++/c# con OpenGL :D En tres semanas lo veré, tengo que refrescarme aun más el c++ porque hay código que aun no entiendo.
Suerte en gales ^^
^MiSaTo^
04/06/2009, 20:59
¿qué es Gales?
Es un país que esta en el Reino Unido. Mu chiquitajo eso si xD
SilentSei
04/06/2009, 21:13
Creas un booleano para saber si la clase esta ya "inicializada". Cuando se llame al constructor estatico del singleton comprueba ese booleano, y entonces le asigna 0 o le suma 1.
ponle ya el código, ya puestos.
Pakoito, eres un perro XD
Pakoito, eres un perro XD
Otras dudas las busqué en google, pero esta en concreto no venía muy bien resuelta. Luego ayer encontré la solución que dio el profesor (tres líneas un día que ni explicó).
Por lo que parece ha debido meter listas de listas con templates y se ha cargado a to' cristo...a mis alumnos no los localizo.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.