Typedef para Ponteiros para Funções
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 35 de 61.
Como você viu, declarações de ponteiros para funções podem ser difíceis de ler. Quando você precisa usar o mesmo tipo de ponteiro para função em vários lugares, a sintaxe se torna repetitiva e propensa a erros. É aqui que typedef vem ao resgate.
A palavra-chave typedef permite criar um alias para qualquer tipo, incluindo ponteiros para funções. Em vez de escrever a declaração completa todas as vezes, você define o tipo uma vez e usa o alias em todo o seu código.
Veja como transformar uma declaração de ponteiro para função em um typedef:
// Sem typedef (bagunçado):
int (*operation)(int, int);
// Com typedef (limpo):
typedef int (*Operation)(int, int);
Operation op; // Muito mais limpo!A sintaxe espelha uma declaração regular de ponteiro para função, mas com typedef no início. O nome que você escolher (aqui, Operation) torna-se um novo tipo que representa “um ponteiro para uma função que recebe dois inteiros e retorna um inteiro”.
Agora você pode usar esse tipo em qualquer 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)); // Saída: 7
printf("%d\n", op2(3, 4)); // Saída: 12
return 0;
}Essa abordagem é especialmente valiosa ao passar ponteiros para funções como parâmetros ou armazená-los em structs: situações que você encontrará com frequência à medida que avançamos rumo ao polimorfismo.
Desafio
FácilVamos praticar o uso de typedef para criar um alias simples para um tipo de ponteiro para função de comparação. Você definirá um tipo que representa uma função que compara dois inteiros e, em seguida, o usará para declarar variáveis e chamar diferentes funções de comparação.
Escreva um programa que:
- Cria um
typedefchamadoComparatorpara um tipo de ponteiro para função que:- Aceita dois parâmetros
int - Retorna um
int(negativo se o primeiro for menor, zero se forem iguais, positivo se o primeiro for maior)
- Aceita dois parâmetros
- Define duas funções de comparação:
ascending: retorna um valor indicando ordem crescente (first - second)descending: retorna um valor indicando ordem decrescente (second - first)
- Em
main, declara uma variávelComparator(usando seu typedef, não a sintaxe bruta de ponteiro para função) - Lê três entradas: dois inteiros e um código de ordem (1 para crescente, 2 para decrescente)
- Atribui a função apropriada à sua variável
Comparatorcom base no código de ordem - Chama o comparador com os dois números e exibe o resultado, seguido de uma mensagem indicando qual valor deve vir primeiro
Você receberá três entradas: o primeiro número, o segundo número e o código de ordem (1 ou 2).
Sua saída deve mostrar o resultado da comparação e, em seguida, indicar qual número vem primeiro com base no sinal do resultado:
Result: -5
First: 3Neste exemplo, com as entradas 3, 8, 1 (ordem crescente): a comparação retorna 3 - 8 = -5 (negativo significa que o primeiro número vem primeiro em ordem crescente), então exibimos First: 3.
Para a linha "First":
- Se o resultado for negativo ou zero, exiba o primeiro número de entrada
- Se o resultado for positivo, exiba o segundo número de entrada
A principal prática aqui é usar seu typedef Comparator para declarar a variável de forma simples, em vez de escrever a sintaxe completa de ponteiro para função.
Experimente você mesmo
#include <stdio.h>
// TODO: Crie um typedef chamado 'Comparator' para um tipo de ponteiro de função
// que recebe dois parâmetros int e retorna um int
// TODO: Defina a função de comparação 'ascending'
// Deve retornar (first - second)
// TODO: Defina a função de comparação 'descending'
// Deve retornar (second - first)
int main() {
// Lê a entrada
int num1, num2, orderCode;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &orderCode);
// TODO: Declare uma variável Comparator usando seu typedef
// TODO: Atribua a função apropriada com base em orderCode
// (1 para ascending, 2 para descending)
// TODO: Chame o comparador e armazene o resultado
int result;
// Exibe o resultado
printf("Result: %d\n", result);
// TODO: Imprima qual número vem primeiro com base no resultado
// Se o resultado for negativo ou zero, imprima o primeiro número
// Se o resultado for positivo, imprima o segundo número
printf("First: %d\n", /* sua lógica aqui */ 0);
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRecapitulação: Dispatch de Calculadora2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online