¿Cómo puedo definir un miembro de una clase como un puntero a otra función miembro?
Me gustaría configurar un puntero de función como miembro de una clase que es un puntero a otra función en la misma clase. Las razones por las que estoy haciendo esto son complicadas.
En este ejemplo, me gustaría que el resultado fuera "1".
class A {
public:
int f();
int (*x)();
}
int A::f() {
return 1;
}
int main() {
A a;
a.x = a.f;
printf("%d\n",a.x())
}
Pero esto falla en la compilación. ¿Por qué?
La sintaxis es incorrecta. Un puntero miembro es una categoría de tipo diferente de un puntero ordinario. El puntero miembro deberá usarse junto con un objeto de su clase:
class A {
public:
int f();
int (A::*x)(); // <- declare by saying what class it is a pointer to
};
int A::f() {
return 1;
}
int main() {
A a;
a.x = &A::f; // use the :: syntax
printf("%d\n",(a.*(a.x))()); // use together with an object of its class
}
a.x
aún no dice sobre qué objeto se llamará la función. Simplemente dice que desea utilizar el puntero almacenado en el objeto a
. Anteponer a
otro momento como operando izquierdo al .*
operador le indicará al compilador en qué objeto llamar a la función.
int (*x)()
no es un puntero a la función miembro. Un puntero a una función miembro se escribe así: int (A::*x)(void) = &A::f;
.
Llamar a la función miembro en el comando de cadena
#include <iostream>
#include <string>
class A
{
public:
void call();
private:
void printH();
void command(std::string a, std::string b, void (A::*func)());
};
void A::printH()
{
std::cout<< "H\n";
}
void A::call()
{
command("a","a", &A::printH);
}
void A::command(std::string a, std::string b, void (A::*func)())
{
if(a == b)
{
(this->*func)();
}
}
int main()
{
A a;
a.call();
return 0;
}
Preste atención a (this->*func)();
la forma de declarar el puntero de función con el nombre de clase.void (A::*func)()