jueves, 8 de mayo de 2008

Punteros a funciones de clases

Queremos utilizar punteros a metodos de clases.

Para ello, utilizamos una referencia a un objeto de la clase y un puntero a la funcion de la clase. Ver codigo

Funciona tambien con clases derivadas creadas mediante factorias:


#include <iostream>


class Clase

{

public:

virtual int funcion1(int x, int y)

{

std::cout << "Funcion 1 (" << x << ":" << y << ")" << std::endl;

}

virtual int funcion2(int x, int y)

{

std::cout << "Funcion 2 (" << x << ":" << y << ")" << std::endl;

}

};


class Hija1 : public Clase

{

public:

int funcion1(int x, int y)

{

std::cout << "Hija 1: Funcion 1 (" << x << ":" << y << ")" << std::endl;

}

int funcion2(int x, int y)

{

std::cout << "Hija 1: Funcion 2 (" << x << ":" << y << ")" << std::endl;

}

};


class Hija2 : public Clase

{

public:

int funcion1(int x, int y)

{

std::cout << "Hija 2: Funcion 1 (" << x << ":" << y << ")" << std::endl;

}

int funcion2(int x, int y)

{

std::cout << "Hija 2: Funcion 2 (" << x << ":" << y << ")" << std::endl;

}

};


class Factory

{

public:

Clase *getClase(int x)

{

Clase *clase;

if (x)

{

clase = new Hija2;

}

else

{

clase = new Hija1;

}

}

};


void ejecuta(Clase &clase, int (Clase::*funcion)(int, int))

{

(clase.*funcion)(10, 20);

}


int main(int argc, char **argv)

{

Clase *clase;

Factory f;

clase = f.getClase(0);

ejecuta(*clase, &Clase::funcion1);

ejecuta(*clase, &Clase::funcion2);

clase = f.getClase(1);

ejecuta(*clase, &Clase::funcion1);

ejecuta(*clase, &Clase::funcion2);

return 0;

}