C/Visual C - Arreglos de apuntadores de funciones.

 
Vista:

Arreglos de apuntadores de funciones.

Publicado por Sergio (1 intervención) el 03/07/2005 06:50:46
Actualmente estoy desarrollando un programa dinámico que con una sola función recupere el resultado de un centenar de funciones administrativas (cálculos de impuestos, retenciones, cotizaciones, liquidación de intereses, etc.), para esto estoy utilizando apuntadores a funciones del tipo float (*pf)(lista argumentos); el problema que se me presenta es que son tantas que me gustaría poder almacenar sus apuntadores en un arreglo, pero hasta ahora si le pongo corchetes a las declaraciones o intento inicializarlas de otra manera me manda errores de compilación o incluso se traslapan los apuntadores. Me han dicho que otra opción es almacenar los apuntadores con asignación de memoria dinámica, pero francamente no tengo idea de cómo hacerlo. Sus opiniones son bienvenidas y gracias =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Arreglos de apuntadores de funciones.

Publicado por fernando.gomez (1603 intervenciones) el 04/07/2005 17:15:30
Una forma muy elegante de hacer esto es emplear los llamados functores. Estos functores son objetos --clases-- que tienen sobrecargado el operador (). Así, pueden ser llamados como funciones. Por ejemplo:

class AdminFunctor
{
public:
virtual void operator()() {
// hacer algo, digamos, imprimir "admin functor"
cout << "admin functor" << endl;
}
};

Puedes emplear la herencia para utilizar un comportamiento polimórfico, y que cada clase derivada sobrecargue el operador () para realizar su propia tarea administrativa. Por ejemplo:

class Impuestos : public AdminFunctor
{
public:
virtual void operator()() {
cout << "impuestos" << endl;
}
};

class Cotizaciones : public AdminFunctor
{
public:
virtual void operator()() {
cout << "cotizaciones" << endl;
}
};

class Liquidacion : public AdminFunctor
{
public:
virtual void operator()() {
cout << "liquidación" << endl;
}
};

Y a la hora de emplearlo, puedes usar contenedores estándares para tener, por ejemplo, un vector de functores:

int main()
{
std::vector<AdminFunctor> vtrFunctores(4);
vtrFunctores.push_back(AdminFunctor());
vtrFunctores.push_back(Impuestos());
vtrFunctores.push_back(Cotizaciones());
vtrFunctores.push_back(Liquidacion());

// y mandas llamar los functores cuando lo requieras ...
std::vector<AdminFunctor>::iterator iterIndex;

for (iterIndex = vtrFunctores.begin(); iterIndex != ctrFunctores.end(); ++iterIndex)
{
// manda llamar al operador ()...
(*iterIndex)();
}

return EXIT_SUCCESS;
}

El ejemplo anterior imprimiría:

admin functor
impuestos
cotizaciones
liquidación

Es una forma elegante de simular punteros a funciones, con la ventaja de que tratas con objetos y tipos seguros. Saludos.





Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar