Declarando Ponteiros para Funções
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 33 de 61.
Até agora, aprendemos a simular herança usando incorporação de structs. Mas o polimorfismo verdadeiro, em que objetos diferentes respondem de maneiras diferentes à mesma chamada, exige algo a mais: ponteiros para funções.
Um ponteiro para função é uma variável que armazena o endereço de uma função. Assim como um ponteiro comum guarda o endereço de dados, um ponteiro para função guarda o endereço de código executável.
A sintaxe pode parecer intimidante à primeira vista. Para declarar um ponteiro para função, especifique o tipo de retorno, depois o nome do ponteiro entre parênteses com um asterisco, seguido dos tipos dos parâmetros:
int (*operation)(int, int);Isso declara uma variável chamada operation que pode apontar para qualquer função que receba dois parâmetros int e retorne um int. Os parênteses em torno de *operation são essenciais; sem eles, você estaria declarando uma função que retorna um ponteiro.
Para atribuir uma função a esse ponteiro, basta usar o nome da função (sem parênteses):
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // Agora operation aponta para addO nome da função funciona como seu endereço. Você também pode usar &add explicitamente, mas isso é opcional: as duas formas são equivalentes em C.
Desafio
FácilVamos praticar a declaração de ponteiros para funções e a atribuição de funções a eles. Você criará um sistema simples de operações matemáticas em que um ponteiro para função pode armazenar diferentes funções aritméticas.
Escreva um programa que:
- Defina duas funções:
multiply: recebe dois parâmetrosinte retorna o produto delessubtract: recebe dois parâmetrosinte retorna o primeiro menos o segundo
- Em
main, declare uma variável ponteiro para função chamadaoperationque possa apontar para funções que recebem dois parâmetrosinte retornam umint - Leia três entradas: dois números inteiros e um código de operação (1 para multiplicação, 2 para subtração)
- Com base no código de operação, atribua a função apropriada ao ponteiro
operation - Imprima o nome da operação atribuída e, em seguida, imprima o resultado da chamada da função por meio do ponteiro
Você receberá três entradas: o primeiro número, o segundo número e o código de operação (1 ou 2).
Sua saída deve ser assim:
Operation: multiply
Result: 35Em que multiply é o nome da operação (ou subtract se o código for 2), e 35 é o resultado da chamada da função por meio do ponteiro (neste caso, 5 × 7).
Lembre-se: para declarar o ponteiro para função, você precisa do tipo de retorno, do nome do ponteiro entre parênteses com um asterisco e dos tipos dos parâmetros. Para atribuir uma função, use apenas o nome da função, sem parênteses.
Experimente você mesmo
#include <stdio.h>
// TODO: Defina a função multiply aqui
// TODO: Defina a função subtract aqui
int main() {
int num1, num2, code;
// Leia a entrada
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: Declare um ponteiro de função chamado 'operation' que possa apontar para
// funções que recebem dois parâmetros int e retornam um int
// TODO: Com base no código da operação (1 para multiplicar, 2 para subtrair),
// atribua a função apropriada ao seu ponteiro de função
// TODO: Imprima o nome da operação e o resultado
// Formato:
// Operação: <name>
// Resultado: <result>
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çalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta7Ponteiros para Funções
Declarando Ponteiros para FunçõesChamando Ponteiros para FunçõesTypedef para Ponteiros para FunçõesPassando Funções como ArgumentosRevisão: Despacho da Calculadora2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online