Typedef para punteros a funciones
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 35 de 61.
Como has visto, las declaraciones de punteros a function pueden ser difíciles de leer. Cuando necesitas usar el mismo tipo de puntero a function en varios lugares, la sintaxis se vuelve repetitiva y propensa a errores. Aquí es donde typedef viene al rescate.
La palabra clave typedef te permite crear un alias para cualquier tipo, incluidos los punteros a funciones. En lugar de escribir la declaración completa cada vez, defines el tipo una vez y usas el alias en todo tu código.
Así es como se transforma una declaración de puntero a función en un typedef:
// Sin typedef (desordenado):
int (*operation)(int, int);
// Con typedef (limpio):
typedef int (*Operation)(int, int);
Operation op; // ¡Mucho más limpio!La sintaxis refleja una declaración normal de puntero a función, pero con typedef al principio. El nombre que elijas (aquí, Operation) se convierte en un tipo nuevo que representa «un puntero a una función que recibe dos int y devuelve un int».
Ahora puedes usar este tipo en cualquier lugar:
typedef int (*Operation)(int, int);
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
Operation op1 = add;
Operation op2 = multiply;
printf("%d\n", op1(3, 4)); // Salida: 7
printf("%d\n", op2(3, 4)); // Salida: 12
return 0;
}Este enfoque es especialmente valioso al pasar punteros a function como parámetros o almacenarlos en structs: situaciones que encontrarás con frecuencia mientras avanzamos hacia el polimorfismo.
Desafío
FácilPractiquemos el uso de typedef para crear un alias claro para un tipo de puntero a función de comparación. Definirás un tipo que represente una función que compare dos enteros y, después, lo usarás para declarar variables y llamar a diferentes funciones de comparación.
Escribe un programa que:
- Cree un
typedefllamadoComparatorpara un tipo de puntero a función que:- Acepte dos parámetros
int - Devuelva un
int(negativo si el primero es menor, cero si son iguales, positivo si el primero es mayor)
- Acepte dos parámetros
- Defina dos funciones de comparación:
ascending: devuelve un valor que indica un orden ascendente (first - second)descending: devuelve un valor que indica un orden descendente (second - first)
- En
main, declare una variableComparator(usando su typedef, no la sintaxis sin formato del puntero a función) - Lea tres entradas: dos enteros y un código de orden (1 para ascendente, 2 para descendente)
- Asigne la función correspondiente a su variable
Comparatorsegún el código de orden - Llame al comparador con los dos números e imprima el resultado, seguido de un mensaje que indique qué valor debe aparecer primero
Recibirás tres entradas: el primer número, el segundo número y el código de orden (1 o 2).
Tu salida debe mostrar el resultado de la comparación y, después, indicar qué número aparece primero según el signo del resultado:
Result: -5
First: 3En este ejemplo, con las entradas 3, 8, 1 (orden ascendente), la comparación devuelve 3 - 8 = -5 (negativo significa que el primer número aparece primero en orden ascendente), así que imprimimos First: 3.
Para la línea "First":
- Si el resultado es negativo o cero, imprime el primer número de entrada
- Si el resultado es positivo, imprime el segundo número de entrada
La práctica clave aquí es usar tu typedef Comparator para declarar la variable de forma clara, en lugar de escribir la sintaxis completa del puntero a función.
Pruébalo tú mismo
#include <stdio.h>
// TODO: Crea un typedef llamado 'Comparator' para un tipo de puntero a función
// que toma dos parámetros int y devuelve un int
// TODO: Define la función de comparación 'ascending'
// Debe devolver (first - second)
// TODO: Define la función de comparación 'descending'
// Debe devolver (second - first)
int main() {
// Leer la entrada
int num1, num2, orderCode;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &orderCode);
// TODO: Declara una variable Comparator usando tu typedef
// TODO: Asigna la función apropiada basándote en orderCode
// (1 para ascending, 2 para descending)
// TODO: Llama al comparador y almacena el resultado
int result;
// Mostrar el resultado
printf("Result: %d\n", result);
// TODO: Imprime qué número va primero basándote en el resultado
// Si el resultado es negativo o cero, imprime el primer número
// Si el resultado es positivo, imprime el segundo número
printf("First: %d\n", /* tu lógica aquí */ 0);
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online