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

Metodo de clase como parametro c++

Estas en el tema de Metodo de clase como parametro c++ en el foro de C/C++ en Foros del Web. Pues eso como se puede hacer para pasar como parametro un metodo de una clase. Yo he echo esto pero no rula: Código: #include <stdio.h> ...
  #1 (permalink)  
Antiguo 21/03/2007, 14:19
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 1 mes
Puntos: 0
Metodo de clase como parametro c++

Pues eso como se puede hacer para pasar como parametro un metodo de una clase.
Yo he echo esto pero no rula:
Código:
#include <stdio.h>

class MiClase{
public:
void fun(){ getchar(); }
};

void pausa(void (*fun)() ){
fun();
}

int main(){
MiClase obj;
pausa(&obj.fun);
}
Espero ke alguien me pueda ayudar gracias
  #2 (permalink)  
Antiguo 21/03/2007, 15:28
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: Metodo de clase como parametro c++

La verdad no soy un experto en C++, pero a ver si puedo ayduarte.

No veo un error claro... que te dice el compilador?

Saludos
  #3 (permalink)  
Antiguo 21/03/2007, 22:30
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Re: Metodo de clase como parametro c++

Que tal serxoker.

Mira, para declarar un puntero a un miembro de la clase (en este caso al método fun) debes hacerlo de manera generica y no a través de un objeto de la clase. Puedes declarar un puntero que pueda apuntar al método fun como sigue:
Código:
void (MiClase::* pFun)(); //pFun es un puntero a una función miembro sin parámetros de la clase MiClase que retorna void
Si te fijas el declarar punteros a funciones miembro(no estáticas) de una clase
es muy similar a las declaraciones de puntero a función, salvo que en este caso tienes que agregar el operador de ámbito de la clase.

Luego la signación la haces de la siguiente manera:
Código:
void (MiClase::* pFun)() = &MiClase::fun;
Luego lo que sucede aquí es que no puedes invocar el método a traves del puntero asi nada mas porque si, sino que necesitas hacerlo a traves de un objeto de la clase, por lo que no tiene tanto sentido(según yo veo) que quieras pasar como único parametro este puntero a una función porque no tendrás un objeto a través del cual invocarlo.

En fin lo único que intento es dar una mini mini intro con esto de los punteros a miembros de clase para que le sigas investigando(hay mucha info en la red) y puedas resolver de la manera que creas mas conveniente el problema.

Aquí puedes ver como invocar a través del puntero:
Código:
#include <iostream>
using std::cout;

class MiClase{
      public:
             void fun(){ cout << "getchar()...";getchar(); }
};

/*void pausa(void (*fun)() ){
fun();
}*///

int main(){
    MiClase obj;
    void (MiClase::* pFun)() = &MiClase::fun;
    (obj.*pFun)(); // <--- a través del puntero
    return 0;

}
Salu2.
  #4 (permalink)  
Antiguo 22/03/2007, 09:34
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Metodo de clase como parametro c++

Gracias, pero eso no me vale (pero si ke ayuda) porke estoy usando la funcion CreateThread (trabajo solo con CRT) y en ella uno de los parametros a meter es la direccion de una funcion. De ahi mi duda, porke al estar trabajando con clases y con este tipo de funciones me aparecen estos errores.
Haber si alguien pudiera ayudarme de todas formas seguire buscando por todo msdn y google.
Gracias.
  #5 (permalink)  
Antiguo 22/03/2007, 10:01
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Metodo de clase como parametro c++

Cita:
Iniciado por serxoker Ver Mensaje
Gracias, pero eso no me vale (pero si ke ayuda) porke estoy usando la funcion CreateThread (trabajo solo con CRT) y en ella uno de los parametros a meter es la direccion de una funcion. De ahi mi duda, porke al estar trabajando con clases y con este tipo de funciones me aparecen estos errores.
Si estas tratando de usar una funcion no estatica ese es el problema para empezar, la funcion a la cual CreateThread llama es de tipo stdcall y los metodos de una clase son de tipo thiscall. Se usa este tipo de convencion de llamada ya que los metodos necesitan que se les pase la direccion del objeto sobre el cual van a trabajar.

Una solucion es transformar el metodo en estatico y pasar a CreateThread como cuarto parametro (justo despues de la direccion de la funcion) el objeto sobre el cual se quiere trabajar.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 22/03/2007, 10:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Metodo de clase como parametro c++

No aclare que la funcion tiene que seguir estricamente el tipo que espera CreateThread asi que para compensar te dejo un ejemplo muy simple:

Código:
#include <windows.h>
#include <stdio.h>

class MiClase
{
  public:
    static DWORD WINAPI fun(LPVOID lpParam)
    { 
      MiClase *mi_clase = (MiClase*)lpParam;
      mi_clase->ejemplo = getchar();
      return 0;
    }
    int ejemplo;
};

void main()
{
  MiClase xt;
  WaitForSingleObject(CreateThread(0, 0, MiClase::fun, (void*)&xt, 0, 0), INFINITE);
  printf("%c\r\n", xt.ejemplo);
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 23/03/2007, 09:32
 
Fecha de Ingreso: marzo-2007
Mensajes: 9
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Metodo de clase como parametro c++

Muchas gracias, bueno menudo ejemplo me has echo. Hoy me pongo a currar como un loco el el prog ke toy haciendo.
Venga hasta otra.
  #8 (permalink)  
Antiguo 23/03/2007, 09:35
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Metodo de clase como parametro c++

Cita:
Iniciado por serxoker Ver Mensaje
Muchas gracias, bueno menudo ejemplo me has echo. Hoy me pongo a currar como un loco el el prog ke toy haciendo.
Venga hasta otra.
De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
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 18:19.