elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Acceso a mienbros no estaticos de clase a traves de estaticos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Acceso a mienbros no estaticos de clase a traves de estaticos  (Leído 4,116 veces)
setupybios

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Acceso a mienbros no estaticos de clase a traves de estaticos
« en: 24 Septiembre 2014, 16:25 pm »

Hola amigos, me ha surgido una gran duda y quería compartirla para ver si alguien que la tenga clara me puede abrir el horizonte. Resulta que estoy trabajando con un framework para realizar juegos, y he visto que ocupan mucho lo que voy a explicar a continuación, que por lo visto es valido porque compila sin problemas y además anda bien y me esta funcionando, sin mas preámbulos paso a explicar mi duda.
Tengo una clase llamémosla X , que hereda de la clase que la vamos a llamar Y, resulta que la clase X tiene un método estatico, y mi duda es la siguiente: por medio de ese método estatico pueden acceder a cualquiera de los métodos no estáticos de las dos clases e invocarlos. Lo pongo con código para que se entienda mejor, no entiendo como es esto posible. Como ese método estatico permite apuntar e invocar a cualquier método no estatico de las clases.

Código
  1. #ifndef __CC_EGLVIEW_ANDROID_H__
  2. #define __CC_EGLVIEW_ANDROID_H__
  3.  
  4. #include "cocoa/CCGeometry.h"
  5. #include "platform/CCEGLViewProtocol.h"
  6.  
  7. NS_CC_BEGIN
  8.  
  9. class CC_DLL CCEGLView : public CCEGLViewProtocol
  10. {
  11. public:
  12.    CCEGLView();
  13.    virtual ~CCEGLView();
  14.  
  15.    bool    isOpenGLReady();
  16.  
  17.    // keep compatible
  18.    void    end();
  19.    void    swapBuffers();
  20.    void    setIMEKeyboardState(bool bOpen);
  21.  
  22.    // static function
  23.    /**
  24.     @brief    get the shared main open gl window
  25.     */
  26.    static CCEGLView* sharedOpenGLView(); METODO ESTATICO
  27. };
  28.  
  29. NS_CC_END
  30.  
  31. #endif    // end of __CC_EGLVIEW_ANDROID_H__


Y HACEN COSAS COMO ESTAS CON ESTE METODO ESTATICO

Código
  1. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionShowAll);

EN DONDE  EL METODO setDesignResolutionSize() ES UN METODO NO ESTATICO DE LA CLASE BASE CCEGLViewProtocol. NO ENTIENDO COMO SE APUNTA . CCEGLViewProtocol es la clase base y  tiene el método setDesignResolutionSize que lo puedo invocar por medio de un método estatico de la clase derivada CCEGLView.
Bueno espero q me tiren un salvavidas asi puedo entender mejor lo que esta sucediendo. Gracias Javier.


« Última modificación: 24 Septiembre 2014, 22:56 pm por setupybios » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Acceso a mienbros no estaticos de clase a traves de estaticos
« Respuesta #1 en: 24 Septiembre 2014, 16:41 pm »

Bienvenido al foro.

En primer lugar, sería conveniente que editases el mensaje y decorases el código con las etiquetas GeSHi para mejorar su legibilidad.

Dicho esto, vamos a intentar resolver tu duda.

Vamos a simplificar el entorno. Imagina que tenemos esta clase:

Código
  1. class POO
  2. {
  3.  public:
  4.  
  5.    int dato( );
  6.  
  7.    static POO* MetodoEstatico( );
  8. };

con esta clase tu podrías tener un código tal que:

Código
  1. std::cout << POO::MetodoEstatico( )->dato( );

Y la pregunta es ¿Por qué? ¿Cómo funciona? Muy sencillo.

Si te fijas, el método estático devuelve un puntero a una clase de tipo POO, lo que estás haciendo es recuperar ese puntero y acceder a los miembros de la instancia apuntada por dicho puntero. El código que te he puesto antes se puede descomponer para facilitar su lectura

Código
  1. POO* puntero = POO::MetodoEstatico( );
  2. std::cout << puntero->dato( );

Este tipo de estructura se usa mucho al programar Singleton, que sirve para asegurarse de que sólo existe una instancia de una clase concreta... una forma de implementar un sigleton es la siguiente:

Código
  1. class Singleton
  2. {
  3.  public:
  4.  
  5.    int dato( )
  6.    { return _dato; }
  7.  
  8.    static Singleton* Instance( )
  9.    {
  10.      static Singleton* instance = new Singleton( );
  11.      return instance;
  12.    }
  13.  
  14.  private:
  15.  
  16.    // Los constructores son privados para impedir que se creen nuevas instancias
  17.    Singleton( )
  18.    { _dato = 1; }
  19.  
  20.    // El constructor copia no hace falta implementarlo, con declararlo como privado vale
  21.    Singleton( const Singleton& );
  22.  
  23.    // Al operador de asignación le pasa lo mismo, no hace falta implementarlo.
  24.    Singleton& operator=( const Singleton& );
  25. };

Obviamente, desde un método estático no se pueden llamar a miembros no estáticos de la clase, el siguiente código no compila:

Código
  1. class POO
  2. {
  3.  public:
  4.  
  5.    int dato( )
  6.    { return _dato; }
  7.  
  8.    static int MetodoEstatico( )
  9.    { return dato( ); }
  10. };

No se si con esto he resuelto tu duda, espero que sí.

Un saludo.


En línea

setupybios

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Acceso a mienbros no estaticos de clase a traves de estaticos
« Respuesta #2 en: 24 Septiembre 2014, 23:07 pm »

Gracias, muchas gracias eferion, me sacaste la venda de los ojos, tenia la respuesta frente a mi, pero a veces si no te lo explica otra persona uno no cae en la cuenta. Entonces lo que hace el metodo estatico es devolver el puntero de la clase es por eso que puedo acceder a los metodos no estaticos sin tener una instancia de la clase. Yo buscaba algo mas complicado pense que de alguna manera cuando compilaba el compilador sabia que el metodo estatico apuntaba a la clase (ya que la clase puede no estar instanciada y no existir ningun objeto de esa clase). Es justo lo que buscaba y si el framework con el que trabajo tiene solo una copia de ciertas clases no sabia que se llamaba programacion Singleton, voy a leer un poco mas acerca de esto. Saludos Javier.
En línea

setupybios

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Acceso a mienbros no estaticos de clase a traves de estaticos
« Respuesta #3 en: 25 Septiembre 2014, 18:49 pm »

eferion al analizar el codigo mas detenidamente y ahora entendiendolo deduzco que cuando yo llamo al metodo no estatico por medio del estatico, estoy ejecutando tambien el metodo estatico (o sea que si el metodo estatico modifica alguna variable o hace algo en ese momento lo estaria haciendo) esto lo deduzco porque si devuelve un puntero a la clase es porque se ejecuto el metodo estatico, ES ASI COMO PIENSO?

Código
  1. std::cout << POO::MetodoEstatico( )->dato( );

en este caso primero ejecuta MetodoEstatico para poder tener el puntero, y despues estaria ejecutando dato().

Gracias Javier.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Acceso a mienbros no estaticos de clase a traves de estaticos
« Respuesta #4 en: 26 Septiembre 2014, 08:26 am »

La línea que has puesto:

Código
  1. std::cout << POO::MetodoEstatico( )->dato( );

Se descompone en estas otras líneas de código:

Código
  1. Prueba* temp = POO::MetodoEstatico( );
  2. int valor = temp->dato( );
  3. std::cout << valor;

Luego, efectivamente, primero se accede a "MetodoEstatico". Este método devuelve un puntero a un objeto de tipo "POO". Después se recupera el valor devuelto por el método "dato" de dicho objeto y, finalmente, se imprime el valor en pantalla.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Punteros estaticos , Existen ¿?
Programación C/C++
skorpion32 6 7,658 Último mensaje 12 Agosto 2011, 07:00 am
por BlackZeroX
acceso directos con la clase RandomAccessFile es posible? « 1 2 »
Java
jhonatanAsm 14 8,217 Último mensaje 28 Marzo 2012, 18:57 pm
por Proteus1989
Metodos Estaticos
Java
charmedever 0 1,339 Último mensaje 28 Septiembre 2012, 05:45 am
por charmedever
Parámetros de inicio estáticos- Servicios Windows
Windows
dokras 0 1,816 Último mensaje 1 Agosto 2013, 17:43 pm
por dokras
Detenidos 5 menores por acosar en clase y a través de las redes sociales a ...
Noticias
wolfbcn 2 4,004 Último mensaje 7 Abril 2014, 06:43 am
por xXSCORPIOXx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines