[Índice][Previo] [Siguiente]

Punteros a funciones

Los punteros a funciones ya existían en C, aunque no se utilizan regularmente. Veamos un ejemplo:

#include <iostream.h>

void printMensaje (float dato);
void printNumero (float dato);
void (*funcPuntero)(float);

main()
{
  float pi = 3.14159;
  printMensaje(pi);
  funcPuntero = printMensaje;
  funcPuntero (pi);
  funcPuntero = printNumero;
  funcPuntero (pi);
  printNumero(pi);
}

void printMensaje(float dato)
{
  cout <<" Esta es la funcion printMensaje " <<'\n';
}

void printNumero(float dato)
{
  cout <<" Este es el dato: " << dato << '\n';
}


La salida del programa será:

Esta es la funcion printMensaje
Esta es la funcion printMensaje
Este es el dato: 3.14159
Este es el dato: 3.14159

Hemos declarado dos funciones, printMensaje y printNumero, y después funcPuntero, que es un puntero a una función que recibe un parámetro real y no devuelve nada (void). Las dos funciones declaradas anteriormente se ajustan precisamente a este perfil, y por tanto pueden ser llamadas por este puntero.
En la función principal, llamamos a la función printMensaje con el parámetro pi, y en la línea siguiente asignamos al puntero a función funcPuntero el valor de printMensaje y utilizamos el puntero para llamar a la misma función de nuevo. Por tanto, las dos llamadas a la función printMensaje son idénticas gracias a la utilización del puntero funcPuntero.

Dado que hemos asignado el nombre de una función a un puntero a función, y el compilador no da error, el nombre de una función debe ser un puntero a una función. Esto es exactamente lo que sucede. Un nombre de una función es un puntero a esa función, pero es un puntero constante que no puede ser cambiado. Sucede lo mismo con los vectores: el nombre de un vector es un puntero constante al primer elemento del vector.
Ya que el nombre de una función es un puntero a esa función, podemos asignar el nombre de una función a un puntero constante, y usar el puntero para llamar a la función. Pero el valor devuelto, así como el número y tipo de parámetros deben ser idénticos. Muchos compiladores de C y C++ no avisan de las diferencias entre las listas de parámetros cuando se hacen las asignaciones. Esto se debe a que las asignaciones se hacen en tiempo de ejecución, cuando la información de este tipo no está disponible para el sistema.
Si en el ejemplo anterior añadimos una función que tiene como parámetro un entero e intentamos llamarla con el puntero a función funcPuntero, el compilador lanzará el siguiente mensaje de error:

   error: In this statement, the referenced type of the pointer value "print_int" is "function (int) returning void", which is not compatible with "function (float) returning void". Compilation terminated with errors.

[Índice][Previo] [Siguiente]


Última modificación: 1-4-97

Comentarios, sugerencias, ideas...

© Beatriz Fuentes Arenaz, 1996-1997

Free Web Hosting