persona - punteros a objetos c++
puntero de funciĆ³n a un miembro de la clase (2)
Estoy tratando de hacer algo como esto:
class A {
void *(*func)(void *);
A(void *(*function)(void *)){
func = function;
}
}
class B {
void *real_func(void *);
A ptr;
B()
:ptr(&real_func)
{
...
}
}
Pero me sale este error:
error: ISO C ++ prohíbe tomar la dirección de una función miembro no cualificada o no entre paréntesis para formar un puntero a la función miembro.
¿Alguien sabe cómo inicializar el puntero de la función a un miembro de la función en la misma clase?
¡Gracias!
Carlos
Como real_func
no es una función miembro estática, su tipo no puede ser void *(*)()
. En cambio, es void *(B::*)()
por lo que necesita declarar func
consecuencia:
void *(B::*func)();
// call it like this
pointer_to_b->*func();
Si tiene cuidado, también puede usar el puntero a A como clase base, pero debe asegurarse de que el puntero a A apunte a una instancia de B:
void *(A::*func)();
En este punto, sin embargo, en su mayoría solo está replicando la funcionalidad de las funciones de miembros virtuales. Así que te recomendaría que lo uses en su lugar:
class A {
virtual void *func() = 0;
};
class B {
void *func() {
// ...
}
};
Podrías crear B así:
struct B {
static void *real_func(void *);
A ptr;
B()
:ptr(&real_func)
{
...
}
};
Una función de miembro estática actúa como una función normal, por lo que puede crear un puntero de función para ella.
Si no necesita un puntero de función normal, puede usar std :: function:
#include <functional>
struct A {
std::function<void *(void*)> func;
A(std::function<void *(void*)> function)
: func(function)
{
}
};
struct B {
void *real_func(void *);
A ptr;
B()
: ptr(std::bind(&B::real_func,this,std::placeholders::_1))
{
}
};