C/Visual C - Puntero a funcion

 
Vista:

Puntero a funcion

Publicado por Ariel (1 intervención) el 30/07/2003 08:18:48
Estoy haciendo una clase para crear ventanas en Windows y dentro de la clase tengo la funcion que maneja los mensajes de la ventana. El problema es que cuando le paso la funcion a la estructura WNDCLASS, me da un error que dice "There is no context in which this conversion is possible".

Es decir, el error esta en la linea:
WNDCLASS MiClase;
MiClase.lpfnWndProc = GestorDeMensajes; ***Error***

GestorDeMensajes esta definido como:
Siendo mi clase llamada ClaseVentana...
LPRESULT ClaseVentana::GestorDeMensajes(HWND,UINT,UINT,long);

Con estos datos que di da el error.
Lo que no entiendo, es que si declaro una funcion igual a GestorDeMensajes, pero fuera de la clase, y se lo paso a la estructura WNDCLASS, funciona sin chistar.
Tambien intente hacer un cast con el tipo WNDPROC pero me da otros errores.

Si alguien sabe que hacer, ayudemeee!!
Graciaaaaaas! =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Puntero a funcion

Publicado por chuidiang (677 intervenciones) el 30/07/2003 09:23:02
No entiendo mucho de windows, pero hay una cosa sobre las funciones y metodos en C++ que te comento.

Una función o método, al igual que cualquier variable, tiene un tipo. Por ejemplo

int a; <--- a es una variable entera e int es su tipo

void (* a) (int) <-- a es un puntero a una función que admite un parametro entero y devuelve void, su tipo es void (*)(int) (La sintaxis es parecida a esto, pero te la pongo de memoria, asi que puedo haberme equivocado).

El tipo de una función global no es igual que el de un método o el de un método estático (aunque devuelvan el mismo tipo y tengan los mismos parametros). De alguna forma hay que ponerle un operador de ambito (lo de poner delante la clase con :: en el tipo Clase::metodo()).

En C++ de unix sólo se pueden pasar como parámetros las funciones globales o métodos estáticos. Creo que no se pueden pasar métodos normales (nunca lo he conseguido ni visto en ningun sitio). Esto tiene pinta de ser lo que te está pasando.

sigue...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Puntero a funcion

Publicado por chuidiang (1 intervención) el 30/07/2003 09:23:40
Prueba lo siguiente. Declara GestorDeMensajes() estatico y pasalo. El problema que tienes al hacerlo estatico es que no tendras acceso a los atributos y metodos no estaticos de la clase. Tendras que hacer un artificio como este

class ClaseVentana: public ...
{
public:
// Atributo estatico para guardar la instancia de ClaseVentana
static ClaseVentana *MiVentana;

// Metodo estatico para poder guardar en MiClase.lpfnWndProc.
// Unicamente llama al metodo no estatico
static .. GestorDeMensajesEstatico (parametros)
{
MiVentana->GestorDeMensajes (parametros);
}

// Metodo no estatico normal que es el que tenias.
... GestorDeMensajes (parametros);
}

En algun sitio tendras que hacer
ClaseVentana::MiVentana = MiClase;

No se si se entiende, es muy liado o te parece un poco chapucero, pero motif para unix (motif es una libreria de botoncitos para unix) funciona de esta manera con los callbacks, aunque esta un poco mejor preparado y te evita el atributo estatico..

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar