Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Puntero de funcion miembro de clase

Estas en el tema de Puntero de funcion miembro de clase en el foro de C/C++ en Foros del Web. Hola saludos tengo un problemon y no se como salir de ello, a ver si alguien me puede echar una mano Tengo una libreria estatica ...
  #1 (permalink)  
Antiguo 07/12/2012, 14:08
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Puntero de funcion miembro de clase

Hola saludos tengo un problemon y no se como salir de ello, a ver si alguien me puede echar una mano

Tengo una libreria estatica con una variable que es un puntero a una funcion de un tipo determinado, y lo que quiero es enviar un puntero a una funcion miembro de una clase sin tener que referenciar la clase dentro de la libreria externa. Aun cuando no estubiera trabajando con una libreria externa el problema sigue siendo el mismo, el compilador no me deja referenciar la funcion a menos que la declare como static; haciendolo asi solo podré acceder a los static declarados en la clase, pero necesito acceder a todos los datos.

Dejo un ejemplo de codigo de lo que intento resolver (pongo el codigo sin la libreria estatica para no liarlo mas):

Código:
#include <stdio.h>


//puntero a funcion externo
typedef int (*pFoo)(int );
pFoo external_fp;


//funcion de asignacion del puntero
void asigna(pFoo fptr) {
    external_fp = fptr;
}


//clase
class A {
    public:
        A() {
            asigna(&A::mifuncion);//aquí me salta el error
        }
        ~A();
        int mifuncion(int v) {
            printf("%d", v);
        }
};


//principal
int main() {
    A *a = new A();
    
    external_fp(1);
    
    getchar();
    return 0;
}
En principio si estubiera fuera de la clase me mostraria el valor 1, pero en la linea 15 me salta el error de "cannot convert 'int (A::*)(int)' to 'int (*)(int)' for argument '1' to 'void asigna(int (*)(int))'

Estoy pensando en añadir un dato void* en la libreria externa donde guardaré un puntero a la clase y desde ese ejecutar la funcion publica no estatica, pero no me convence.

Alguna solucion? O alguna idea para hacerlo de otra forma?

Muchas gracias por adelantado y saludos
vosk
  #2 (permalink)  
Antiguo 07/12/2012, 17:01
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Puntero de funcion miembro de clase

Bueno solucionado, de todas formas gracias por el foro.

Por si alguien lo necesita encontré un truco de Chris Becke que lo soluciona con templates de clases; el ejemplo es el mismo de mi post pero con la solucion adaptada:

Código:
#include <stdio.h>


//estructura de callback
struct Callback {
    virtual ~Callback() {}
    virtual int operator()(int arg1) = 0;
};


//template para cualquier class pero con una funcion estandarizada, en este caso una tipo int con un argumento tambien int
template<class T> class ClassCallback : public Callback {
    T* _classPtr;
    typedef int(T::*fncb)(int arg1);
    fncb _cbProc;
    
    public:
        ClassCallback(T* classPtr,fncb cbProc):_classPtr(classPtr),_cbProc(cbProc) {}
        virtual int operator()(int arg1) {
            (_classPtr->*_cbProc)(arg1);
        }
};


//puntero funcion externa
Callback* ptr_funcion;


//funcion de asignacion del puntero
void asigna(Callback* ptr) {
    ptr_funcion = ptr;
}


//clase
class A {
    public:
        A() {
            //crea una nueva estructura de callback
            Callback* pCB = new ClassCallback<A>(this, &A::mifuncion);
            asigna(pCB);
        }
        int mifuncion(int v) {
            printf("%d", v);
        }
};


//principal
int main() {
    
    A *a = new A();
    (*ptr_funcion)(1);
    delete ptr_funcion;
    
    getchar();
    return 0;
}
Saludos
vosk

Etiquetas: clase, funcion, int, puntero, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:52.