Olá,
Esse é um tema que eu sempre achei interessante, mas sinceramente nunca tinha entendido direito. Mesmo embora tenha usado.
Como quase tudo que é bom em programação (em cpp), é um conceito muito simples.
Como TODO ponteiro, um ponteiro de função contém um endereço de memória, no caso do ponteiro para uma função, contém o endereço de memória de onde está o inicio do código (chamada) da função.
Pensando em códigos.
Um ponteiro normal seria algo assim:
int * p;
P é um ponteiro para uma variável int. Isso é muito simples.
Um ponteiro de uma função seria algo assim:
bool (*funcao) (int)
Esse ponteiro se lê: “funcao” é um ponteiro para uma função que recebe um int como parametro e retorna um bool.
Um exemplo de uso seria uma calculadorinha(mais padrão impossível):
/*
* Daniel Balieiro
* daniel@balieiro.com
*/
#include
// Declarando as funções utilizadas
double somar(double, double); // função que soma o primeiro argumento com o segundo
double subtrair(double, double); // função que subtrai o primeiro argumento com o segundo
void menu(); // função que imprime o menu
double get_valor(); // função que retorna o valor digitado pelo cliente
bool is_menu_valido(int); // função que verifica se o indice do menu escolhido está certo
// Função principal do programa
int main() {
// declara um array com os ponteiros para as funções
double (*array[2])(double, double) = {somar, subtrair};
int arg = 0; // variável que contém o índice do menu
do {
menu(); // chama a função de menu
std::cin >> arg; // regata o valor digitado pelo cliente e coloca na variável arg
// verificamos se o valor digitado é válido
if(is_menu_valido(arg)) {
double valor1 = get_valor(); // resgata o valor 1
double valor2 = get_valor(); // resgata o valor 2
/*
* aqui a função é invocada usando o ponteiro.
* usa-se o índice do array, que é o valor escolhido pelo cliente, para retirar o
* ponteiro da função do array e este já é derreferenciado, para invocar a função
* passando o valor1 e valor2 como parametro
*/
std::cout << "\nResultado: " << (*array[arg])(valor1,valor2);
std::cout << "\n\n\n";
}
} while( arg != 2); // reinicia o loop caso não tenha sido pedido para parar
std::cout << "\nSaindo...\n";
return 0;
}
bool is_menu_valido(int menu) {
return (menu == 0 || menu == 1);
}
double get_valor() {
std::cout << "\nDigite o valor para a operação: ";
double valor = 0;
std::cin >> valor;
return valor;
}
void menu() {
std::cout << "Digite " << std::endl;
std::cout << "\t 0 - Somar" << std::endl;
std::cout << "\t 1 - Subtrair" << std::endl;
std::cout << "\t 2 - Sair" << std::endl;
}
double somar(double a, double b) {
return a + b;
}
double subtrair(double a, double b) {
return a - b;
}
Simples demais!
Depois ainda tem gente que me pergunta porque eu gosto tanto de Cpp.
Abraços!