¿Cómo puedo definir un miembro de una clase como un puntero a otra función miembro?

Resuelto Mike asked hace 14 años • 8 respuestas

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é?

Mike avatar Mar 08 '10 22:03 Mike
Aceptado

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.xaún no dice sobre qué objeto se llamará la función. Simplemente dice que desea utilizar el puntero almacenado en el objeto a. Anteponer aotro momento como operando izquierdo al .*operador le indicará al compilador en qué objeto llamar a la función.

Johannes Schaub - litb avatar Mar 08 '2010 15:03 Johannes Schaub - litb

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;.

Bertrand Marron avatar Mar 08 '2010 15:03 Bertrand Marron

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)()

Heto avatar May 28 '2016 14:05 Heto