La Web del Programador: Comunidad de Programadores
 
    Pregunta:  5164 - PUNTEROS A FUNCIONES EN VISUAL C++
Autor:  luis
Agradecería de antemano cualquier tipo de ayuda.

PROBLEMA: ¿Como se pasa un puntero a una función entre clases diferentes?

CASO A RESOLVER: He derivado una clase de CButton ("CMiBoton") declarando en el fichero de cabecera ("MiBoton.h") un puntero a una función "genérica" ("void (Pulsar*)()"). Es decir:

// MiBoton.h

class CMiBoton : public CButton
{
...
void (Pulsar*)();
...
afx_msg void OnClick();
}

// MiBoton.cpp

void CMiBoton::OnClick()
{
(*Pulsar)();
}

La implementación de esta función ("Pulsar") se lleva a cabo en la ventana padre que contiene dicho botón ("CMiVentana") derivada de CDialog. Es decir:

// MiVentana.h

#include "MiBoton.h"

class CMiVentana : public CDialog
{
CMiBoton boton1;
CMiBoton boton2;
...
void Pulsar1();
void Pulsar2();
}

// MiVentana.cpp

void CMiVentana::Pulsar1()
{
MessageBox("Pulsó botón 1");
}

void CMiVentana::Pulsar2()
{
MessageBox("Pulsó botón 2");
}

A RESOLVER: ¿Cómo hago para desde la ventana padre ("CMiVentana") en "OnInitDialog" asignar a cada botón miembro su función correspondiente? Es decir, cuando pulse "botón1" ha de visualizarse "Pulsó botón 1" y lo mismo con botón 2, "Pulsó botón 2".

RESUMIENDO: QUIERO IMPLEMENTAR DICHO CODIGO DESDE LA VENTANA PADRE ¡¡¡OBLIGATORIAMENTE!!! ¿COMO LO HAGO?

Gracias por llegar hasta este punto de lectura y por cualquier suge

  Respuesta:  Antonio Campos
La primera idea que se me ocurre, es que implementes un constructor en la clase CMiBoton que tenga por parametro un puntero a funcion, y luego al construir los objetos en la clase CMiVentana llamar a este constructor pasandole la direccion de la funcion correspondiente.

En cuanto a codigo creo que podria ser algo asi:

CMiBoton::CMiBoton(void (pf*)())
{
Pulsar = pf;
}

//------------------------

class CMiVentana : public CDialog
{
void Pulsar1();
void Pulsar2();
...
CMiBoton boton1(Pulsar1);
CMiBoton boton2(Pulsar2);
...
}