es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer que una devolución de llamada cambie una variable de una clase sin utilizar una variable global?

Tengo una función que toma otra función como una devolución de llamada, pero necesito que la devolución de llamada sea parte de una clase como un método no estático, porque tengo que cambiar una variable específica con la devolución de llamada.

El problema es que la función setCallback() no quiere una función de método sino una función normal y estática.

Entiendo que la función setCallback() no puede simplemente usar la función de la clase tal cual está, ya que no sabe a qué objeto llamar y la sintaxis para las clases es diferente. Sé que también podría resolver esto con una variable global, pero realmente no quiero tener que usarlas y me han dicho que es posible hacer cualquier cosa sin globales.

Nota: la función setCallback() es de una biblioteca y no tengo forma de cambiarla.

header.h

class myClass
{
    int classVariable;

    myClass();

    callbackFunction(int callbackVariable);
};

source.cpp

myClass::myClass()
{
    library::setCallback(this->callbackFunction); // ???
}

myClass::callbackFunction(int callbackVariable)
{
    classVariable = callbackVariable;
}

donde 'setCallback()' se ve así:
library::setCallback(void (*)(int callbackVariable));

Edición:
Resulta que había una solución específica de la biblioteca para esto

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para pasar un método de clase como devolución de llamada a la función setCallback(), puedes utilizar una combinación de un método estático y un puntero estático a la instancia de la clase. Aquí te mostramos cómo puedes modificar tu código:

    header.h

    class myClass
    {
        int classVariable;
    
        myClass();
    
        // declara la función de devolución de llamada como estática
        static void callbackFunction(int callbackVariable);
    
        // declara un puntero estático para guardar la instancia de la clase
        static myClass* instance;
    };
    

    source.cpp

    // Inicializa el puntero estático a nulo
    myClass* myClass::instance = nullptr;
    
    myClass::myClass()
    {
        // Guarda la instancia actual de la clase en el puntero estático
        instance = this;
    
        // Pasa el método de devolución de llamada estático a setCallback
        library::setCallback(callbackFunction);
    }
    
    // Define el método de devolución de llamada estático
    void myClass::callbackFunction(int callbackVariable)
    {
        // Accede a la instancia de la clase a través del puntero estático
        instance->classVariable = callbackVariable;
    }
    

    Con esta modificación, la función setCallback() recibirá un método estático que tiene acceso a la instancia de la clase a través del puntero estático. Cuando la biblioteca invoque la devolución de llamada, podrá utilizar el puntero estático para modificar la classVariable de la instancia de clase correspondiente.

Comments are closed.