C++ 101 – Parte 10 – Ponteiros para funções

Posted on 04/12/2011

0


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:


              
#include 
using 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:

image

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:

image

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:

image

Era isso!

Smiley piscando

Etiquetado:,
Posted in: Post