2010-03-08 11 views
15

Estaba tratando de declarar una función de devolución de llamada en clase y luego, en algún lugar que leo, la función debe ser estática pero no explica por qué?¿Por qué las funciones de devolución de llamada deben ser estáticas cuando se declaran en la clase

#include <iostream> 
using std::cout; 
using std::endl; 

class Test 
{ 
public: 
    Test() {} 

    void my_func(void (*f)()) 
    { 
     cout << "In My Function" << endl; 
     f(); //Invoke callback function 
    } 

    static void callback_func() 
    {cout << "In Callback function" << endl;} 
}; 

int main() 
{ 
    Test Obj; 
    Obj.my_func(Obj.callback_func); 
} 

Respuesta

20

Una función de miembro es una función que necesita una instancia de clase para llamar. No se puede llamar a la función de miembros sin proporcionar la instancia a la que llamar. Eso hace que sea más difícil de usar a veces.

Una función estática es casi como una función global: no necesita una instancia de clase para llamar. Por lo tanto, solo necesita obtener el puntero a la función para poder llamarla.

Eche un vistazo a std :: function (o std :: tr1 :: function o boost :: function si su compilador no lo proporciona aún), es útil en su caso ya que le permite usar cualquier cosa que es invocable (proporcionar() sintaxis u operador) como devolución de llamada, incluidos objetos invocables y funciones de miembro (ver std :: bind o boost :: bind para este caso).

8

Las rellamadas deben ser estáticas para que no tengan un parámetro this implícito como primer argumento en su firma de función.

0

Si utiliza punteros a funciones, el entorno de ejecución no puede pasar una referencia a una instancia al llamar a la función. Pero puede usar std :: mem_fun <>, para usar functors y métodos miembros.

2

Tiene que ser estático para que la firma de la función coincida. Cuando se llama a una función miembro, se incluye un parámetro oculto en la llamada (es decir, el puntero "this"). En funciones miembro estáticas, este puntero no se pasa como un parámetro.

4

Los métodos no estáticos requieren una instancia 'this' y solo pueden invocarse en una instancia de objeto.

Sin embargo, es posible utilizar devoluciones de llamada no estáticas, pero son sintácticamente mucho más difíciles de escribir. Ver http://www.newty.de/fpt/callback.html#member para una explicación.

2

Marshal Cline le da la respuesta completa here . Toda la sección contiene todo lo que necesita saber.

Para resumir, puede explicar que necesita un miembro estático porque el puntero this no es necesario (a diferencia de los métodos de miembros normales). Pero también cubre que el uso de una estática puede no ser suficiente para todos los compiladores, ya que la convención de llamadas de C++ puede ser diferente entre C y C++.

Por lo que la recomendación es utilizar una función no miembro extern "C".

+1

su enlace está roto. Además, es mejor publicar respuestas reales en lugar de enlaces. –

+0

@BenH Gracias por el aviso. Respuesta mejorada y enlace fijo. – daramarak

+0

Más uno PARA el enlace (explicaciones muy útiles y fáciles de entender) –

Cuestiones relacionadas