C/Visual C - Punteros a funciones en Visual C++

 
Vista:

Punteros a funciones en Visual C++

Publicado por dani (17 intervenciones) el 15/01/2001 00:00:00
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 generica ("void (Pulsar*)()"). Es decir:

// MiBoton.h

class CMiBoton : public CButton
{
...

La implementación de esta función se lleva a cabo en la ventana padre que contiene dicho botón ("CMiVentana") derivada de CDialog.
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
Imágen de perfil de Alejandro

Pasar un puntero a una función entre clases diferentes en C++

Publicado por Alejandro (913 intervenciones) el 04/09/2024 23:10:30
Para pasar un puntero a una función entre clases diferentes en C++, puedes utilizar punteros a funciones miembro o utilizar funciones lambda y objetos de función. Aquí tienes dos enfoques posibles:

Enfoque 1: Punteros a funciones miembro:
1. Define un puntero a función miembro en la clase `CMiBoton` que apunte a la función deseada. Por ejemplo, puedes declarar un puntero a función miembro llamado `pFuncion` en `CMiBoton` de la siguiente manera:
1
2
3
4
5
6
class CMiBoton : public CButton
{
public:
    void (CMiVentana::*pFuncion)(); // Puntero a función miembro de CMiVentana
    // ...
};
2. En la clase `CMiVentana`, define la función que deseas pasar como puntero a función miembro. Por ejemplo:
1
2
3
4
5
6
7
8
9
class CMiVentana : public CDialog
{
public:
    void Pulsar()
    {
        // Implementación de la función Pulsar
    }
    // ...
};
3. En el código donde creas una instancia de `CMiBoton`, asigna el puntero a función miembro `pFuncion` al puntero a función miembro de `CMiVentana`. Por ejemplo:
1
2
3
4
CMiBoton miBoton;
CMiVentana miVentana;
 
miBoton.pFuncion = &CMiVentana::Pulsar;
4. Ahora puedes llamar a la función `Pulsar` utilizando el puntero a función miembro en `CMiBoton`. Por ejemplo:
1
(miVentana.*miBoton.pFuncion)();

Enfoque 2: Funciones lambda y objetos de función:
1. En lugar de utilizar un puntero a función miembro, puedes utilizar una función lambda o un objeto de función en `CMiBoton` para almacenar la función deseada. Por ejemplo:
1
2
3
4
5
6
class CMiBoton : public CButton
{
public:
    std::function<void()> funcion; // Objeto de función
    // ...
};
2. En el código donde creas una instancia de `CMiBoton`, asigna la función lambda o el objeto de función a `funcion`. Por ejemplo:
1
2
3
4
CMiBoton miBoton;
CMiVentana miVentana;
 
miBoton.funcion = [&miVentana]() { miVentana.Pulsar(); };
3. Ahora puedes llamar a la función utilizando el objeto de función en `CMiBoton`. Por ejemplo:
1
miBoton.funcion();

Estos son solo dos enfoques posibles para pasar un puntero a una función entre clases diferentes en C++. Puedes elegir el enfoque que mejor se adapte a tus necesidades y al diseño de tu programa. Recuerda ajustar el código según tus requerimientos específicos.

Espero que esta información te sea útil y te ayude a resolver tu problema. ¡Buena suerte con tu proyecto, Dany!
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