2010-05-24 12 views
8

dado una clase de ejemplo:El uso de un puntero de función miembro dentro de una clase

class Fred 
{ 
public: 
Fred() 
{ 
    func = &Fred::fa; 
} 

void run() 
{ 
    int foo, bar; 
    *func(foo,bar); 
} 

double fa(int x, int y); 
double fb(int x, int y); 

private: 
double (Fred::*func)(int x, int y); 
}; 

me sale un error de compilación en la línea llamando a la función miembro a través del puntero "* func (foo, bar)", diciendo: "término no evalúa a una función tomando 2 argumentos". ¿Qué estoy haciendo mal?

+0

gracias por la edición :) –

+0

... no hay problema;) – neuviemeporte

Respuesta

18

La sintaxis que necesita es así:

((object).*(ptrToMember)) 

Así que su llamada sería:

((*this).*(func))(foo, bar); 

Creo que una sintaxis alternativa sería:

(this->*func)(foo, bar); 
6

necesita el siguiente sintaxis funky para llamar a funciones miembro a través de un puntero:

(this->*func)(foo, bar); 
4

Hay dos cosas que debe tener en cuenta. En primer lugar está la declaración del tipo de puntero de función:

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 

A continuación se muestra la sintaxis para llamar a la función utilizando un puntero:

(this->*func)(foo,bar) 

Aquí está el código de ejemplo modificado que compilar y ejecutar:

#include <iostream> 

class Fred 
{ 
public: 
    Fred() 
    { 
    func = &Fred::fa; 
    } 

    void run() 
    { 
    int foo = 10, bar = 20; 
    std::cout << (this->*func)(foo,bar) << '\n'; 
    } 

    double fa(int x, int y) 
    { 
    return (double)(x + y); 
    } 
    double fb(int x, int y) 
    { 
    } 

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 
}; 

int 
main() 
{ 
    Fred f; 
    f.run(); 
    return 0; 
} 
0

Las funciones miembro de la clase no estáticas han ocultado este puntero como argumento.

Creo que la sintaxis (this -> * func) (foo, bar) es la manera de hacer que el compilador entienda que debe agregar esto a la función.

1

Una función de miembro con dos args es realmente una función de tres arg. 'esto' es un argumento implícito, por lo que el error que está obteniendo se trata de perder el 'esto' arg.

Cuestiones relacionadas