Cuando muchas o todas las opciones presentadas en un menú comparten características similares, una excelente opción, aunque no la única, es implementar dichas opciones a través de un arreglo de apuntadores a función.
En el Ejemplo 4.3 se desarrolló una calculadora con las operaciones aritméticas básicas de suma, resta, multiplicación y división. En esta entrada se retomará dicho ejemplo para reescribirlo utilizando un arreglo de apuntadores a funciones.
El Ejemplo 7.13 muestra que las cuatro funciones de suma, resta, multiplica y divide comparten un patrón común: todas reciben dos argumentos de tipo float y regresan un valor de tipo float.
El patrón identificado se aprovecha en la línea 15, la cual declara el arreglo funciones de cuatro apuntadores a funciones que reciben dos argumentos de tipo float y regresan un valor de tipo float. El arreglo es inicializado en la declaración con una lista de identificadores: suma, resta, multiplica y divide.
El uso del arreglo de apuntadores funciones se presenta en la línea 29, en donde el valor de la variable op se utiliza como índice para invocar a la función correspondiente que realizará la operación seleccionada en base al menú de opciones (líneas 37-51).
En este sentido, si op tiene el valor tres por ejemplo, la expresión:
( * funciones[op - 1]) ( a, b )
se transforma en la expresión:
multiplica(a, b)
debido a que el identificador que se encuentra en la posición dos (op - 1) del arreglo de apuntadores a funciones funciones, es precisamente multiplica. La resolución de los otros identificadores ocurre de manera análoga.
El llamado a la función a invocar se resuelve en tiempo de ejecución, ya que el llamado a través del arreglo de apuntadores a funciones de la línea 29 es un llamado implícito.
Finalmente, la función menu indica con void que no recibirá ningún tipo de argumento. Todos los demás detalles del programa de ejemplo ya deberían resultarle familiares al lector. Una posible salida para el Ejemplo 7.13 se muestra en la siguiente figura:
Una posible salida del Ejemplo 7.13. |