Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con clase estatica

Estas en el tema de problema con clase estatica en el foro de C/C++ en Foros del Web. Resulta que tengo una clase estática: Código: class gestorTexturas { public: static GLuint getTexturaObjIndex(std::string nombre); static void cargaTextura(std::string nombre, std::string ruta); private: typedef std::map<std::string, GLuint> ...
  #1 (permalink)  
Antiguo 20/05/2011, 11:50
Avatar de darkgaze  
Fecha de Ingreso: febrero-2006
Ubicación: Madrid, España
Mensajes: 462
Antigüedad: 18 años, 2 meses
Puntos: 2
problema con clase estatica

Resulta que tengo una clase estática:

Código:
class gestorTexturas
{
    public:
        static GLuint getTexturaObjIndex(std::string nombre);
        static void cargaTextura(std::string nombre, std::string ruta);
    private:
        typedef std::map<std::string, GLuint> parejaTexturaNumero;
        static parejaTexturaNumero _listaTexturasIds;
};
y cuando en el .cpp declaro la funcion

Código:
GLuint gestorTexturas::getTexturaObjIndex(std::string nombre)
{
    parejaTexturaNumero::iterator it = _listaTexturasIds.find(nombre);
    if (it != _listaTexturasIds.end())
        return (it->second);
    else
        return 0;
    
}
Cuando accedo a _listaTexturasIds desde dentro , me dice que

Undefined Reference to gestorTexturas::_listaTexturasIds

Y parece que no funciona... creo que me estoy saltando algo de la teoría de clases estáticas y miembros estáticos. Por tener un miembro dentro de la clase tengo que hacer que deje de ser estática???. No lo necesito, solamente quiero tener una lista global en esta clase pero no la encuentra. Ni siquiera me ayuda el ide. Solo me saca los miembros locales si hago
gestorTexturas::_listaTexturasIds .... si lo pongo normal, no sabe lo que es.

Tendré que hacer una clase no estática y un patrón de programación para que solo haya una instancia de esta clase?


Gracias
__________________
Darkgaze
  #2 (permalink)  
Antiguo 20/05/2011, 13:52
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años
Puntos: 24
Respuesta: problema con clase estatica

Pon el typedef fuera de la clase para poder acceder a él.
Lo segundo en el .cpp debes definir el objeto estático:
Código C++:
Ver original
  1. parejaTexturaNumero gestorTexturas::_listaTexturasIds;
Por último, añade el ambito cuando usas _listaTexturasIds
Código C++:
Ver original
  1. parejaTexturaNumero::iterator it = gestorTexturas::_listaTexturasIds.find(nombre);

No lo he probado pero supongo que esto lo solucionará :)
__________________
Foros Desarrollo de Juegos
  #3 (permalink)  
Antiguo 21/05/2011, 11:13
Avatar de darkgaze  
Fecha de Ingreso: febrero-2006
Ubicación: Madrid, España
Mensajes: 462
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: problema con clase estatica

Gracias mil por tu tiempo.

Es curioso. nunca veo definir los typedef fuera de las clases... cuándo se hace una cosa o la otra?

Ha funcionado pero no enteindo por qué.

Tengo que definir en el h las dos cosas.

- el typedef fuera de la clase, cosa que no he hecho nunca. por qué aquí?
- el elemento estático: static parejaTexturaNumero _listaTexturasIds;
- y en el .cpp poner el elemento estático sin static y con el descriptor del ambito:
parejaTexturaNumero gestorTexturas::_listaTexturasIds;

Esto es rarísimo. Me podríais explicar por qué es así? y por qué en mis enormesl ibros de c++ no se menciona ni pio de todo esto?


Gracias amigos!
__________________
Darkgaze
  #4 (permalink)  
Antiguo 23/05/2011, 14:39
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años
Puntos: 24
Respuesta: problema con clase estatica

Si te fijas, antes tenías el typedef dentro de la parte privada de la clase, por lo que no es accesible desde fuera de las instancias de esa clase. Esto significa que no puede ser accedido desde un miembro estático.

Sobre los miembros estáticos, los declaras en el archivo header. Pero al ser estáticos so se inician cuando creas un objeto especifico ya que estos miembros son compartidos por todas las instancias de esa clase. Por esta razones hay que iniciarlos en el archivo de source (.cpp).

Espero que esto resuelva tus dudas :)
__________________
Foros Desarrollo de Juegos
  #5 (permalink)  
Antiguo 24/05/2011, 16:30
Avatar de darkgaze  
Fecha de Ingreso: febrero-2006
Ubicación: Madrid, España
Mensajes: 462
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: problema con clase estatica

mmm. en la parte privada? yo pensaba que por defecto dentro de una clase sin identificador private: public: antes era publica.... entonces es privada por defecto, no?

Entendido. pero lo de crearlos fuera de una funcíón y en el cpp... es un poco marciano, insisto.

Supongo que son rarezas del c++

gracias
__________________
Darkgaze

Etiquetas: c++, clase, estatica, estatico
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:55.