Olá pessoal. Tudo certo?!
Nesse post, entenderemos um pouco mais sobre ponteiros. Especificamente, vamos ver como utilizar ponteiros para funções.
Em termos práticos, a utilidade (importante: apenas em primeira impressão. Sem closures associadas) de um “ponteiro para função” é semelhante a delegates do C#.
Se está “chegando agora”, considere dar uma olhada nos outros posts dessa série.
Primeiro exemplo
Para tornar as coisas mais simples, comecemos com um exemplo prático:
#includeusing namespace std; int Add(int a, int b) { return a + b; } int Subtract(int a, int b) { return a - b; } int Multiply(int a, int b) { return a * b; } int Divide(int a, int b) { return a / b; } void main() { int (*pfun)(int, int) = Add; cout << pfun(2, 2) << endl; }
Executando esse programa, temos:
Como pode perceber, todas as funções possuem um “header” bem semelhante. Na prática, apenas o nome da função muda.
Este é um cenário perfeito para utilização de ponteiros para função. É exatamente isso que fazemos! Como pode ver na função main a criação do ponteiro tem sintaxe simples. Declaramos um ponteiro com o nome “pfun” que “aponta” para funções que aceitam dois argumentos. Os parênteses em torno do nome do ponteiro, assim como o asterísco são necessários. Sem eles, estaríamos definindo uma função e não um ponteiro.
Para mudar a função “apontada”, basta fazer uma nova atribuição. Observe:
void main() { int (*pfun)(int, int) = Add; cout << pfun(2, 2) << endl; pfun = Divide; cout << pfun(2, 2) << endl; }
Resultado:
Pointeiros para funções como argumentos
Como “ponteiro para função” é um tipo, podemos utiliza-lo em uma lista de argumentos.
void Print(int a, int b, int (*pfun)(int, int)) { cout << pfun(a, b) << endl; } void main() { Print(2, 2, Add); Print(2, 2, Divide); }
No exemplo, passamos um “ponteiro para função” como parâmetro para a função print.
Arrays de ponteiros para função
Naturalmente, é possível definir arrays com ponteiros para função. Trata-se de uma prática interessante em cenários onde desejamos fazer alguma composição.
Observe:
void main() { int (*pfun[4])(int, int) = { Add, Subtract, Multiply, Divide }; for (int i = 0; i < 4; i++) Print(8, 4, pfun[i]); }
Resulta:
Era isso!
Posted on 04/12/2011
0