2010-11-15 25 views
13

Estoy leyendo material sobre puntero a función en C++, y encuentro una definición de función que no entiendo.
definición de función estándar tiene la forma:
Una pregunta sobre la definición de función en C++

type name (param...) 

Pero la siguiente definición parece un poco extraño para mí. Puede alguien explicármelo ? Gracias.

float (*GetPtr1(const char opCode)) (float, float)<br> 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
} 


Nota: Más y Menos son dos funciones con parámetro (float, float) y devuelven un flotador.

+0

puede ser mejor para comprobar 'else if (código de operación == '-')' para evitar que se queme un poco de aceite de la medianoche en el futu re – Chubsdad

+0

El tema no dice mucho sobre su pregunta ... Debería. – mih

Respuesta

10

La regla para la lectura de las declaraciones peludas es comenzar con el identificador más a la izquierda y su forma de trabajo, recordando que () y [] se unen antes de * (es decir, *a[] es una matriz de punteros, (*a)[] es un puntero a una matriz, *f() es una función que devuelve un puntero, y (*f)() es un puntero a una función):

 GetPtr1          -- GetPtr1 
     GetPtr1(    )     -- is a function 
     GetPtr1(   opCode)     -- taking a single parameter named opCode 
     GetPtr1(const char opCode)     -- of type const char 
     *GetPtr1(const char opCode)     -- and returning a pointer 
     (*GetPtr1(const char opCode)) (   ) -- to a function 
     (*GetPtr1(const char opCode)) (float, float) -- taking two parameters of type float 
float (*GetPtr1(const char opCode)) (float, float) -- and returning float 

lo tanto, si opCode es igual a '+', GetPtr1 voluntad r Deje un puntero a la función Plus, y si es '-', devolverá un puntero a la función Minus.

C y la sintaxis de la declaración de C++ está centrada en la expresión (como Bjarne quisiera pretender de otra manera); la forma de la declaración debe coincidir con la forma de la expresión tal como se usaría en el código.

Si tenemos una función f que devuelve un puntero a int y queremos acceder al valor que se apunta a, que ejecutará la función y eliminar la referencia al resultado:

x = *f(); 

El tipo de la expresión*f() es int, por lo que la declaración/definición de la función es

int *f() { ... } 

Ahora supongamos que tenemos una función f1 que devuelve un puntero a la función f definida anteriormente, y queremos acceder a ese valor entero llamando al f1. Tenemos que llamar f1, derefence el resultado (que es la función f), y ejecutarlo, y luego eliminar la referencia que resultado (ya f devuelve un puntero):

x = *(*f1())(); // *f1() == f, so (*f1())() == f() and *(*f1())() == *f() 

El tipo de la expresión*(*f1())() es int, por lo que el decaration/definición para f1 necesidades para ser

int *(*f1())() { return f; } 
+0

aprecio la explicación en profundidad de la regla derecha-izquierda +1 – Chubsdad

+0

+1 para expandir un puntero de función en sus componentes. Ayudará a la gente a encontrarlos por primera vez. –

3

Es una función que toma un const char y devuelve un puntero a una función que toma float, float y devuelve un float.

+0

... y devuelve float –

+0

@Paul: De acuerdo, gracias. –

16

GetPtr1 es una función que toma un carácter de código de operación y devuelve un puntero a una función. La función que devuelve toma dos flotantes y devuelve un flotante.

Muchas veces es más fácil de leer si haces algo como esto:

typedef float (*FloatOperationFuncPtr) (float, float); 

FloatOperationFuncPtr GetPtr1(const char opCode) 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
} 
+1

+1, Mucho más fácil de usar typedefs, también podría agregar la versión 'C++ 0x', algo similar a:' typedef std :: function FloatOperationType; 'si mi memoria me sirve bien –

2

Eso significa una función que toma un carácter y devuelve un puntero a una función que toma dos flotadores y devuelve un flotador.

5

Siempre es bueno saber acerca de http://cdecl.org para tales situaciones. Tenga en cuenta que solo funciona si elimina los nombres de los parámetros. Esto es lo que obtienes por float(*GetPtr1(const char))(float, float):

declaran GetPtr1 como función (const char) regresar puntero a funcionar (float, float) regresar float

+0

Nifty t o o l. –

1

GetPtr1 es una función que toma dos flotador como parámetros de entrada y devuelve un puntero a una función . Esto es mucho más claro:

typedef float(*Func)(float, float); 


Func GetPtr1(const char opCode) 
{ 
    if(opCode == '+') 
     return &Plus; 
    else 
     return &Minus; // default if invalid operator was passed 
}