Posted on 28-03-2008
Filed Under (C/C++) by Daniel Balieiro

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!

Share
(0) Comments    Read More