Newsgroup: it.comp.lang.c++
Titolo: puntatori a funzioni membro

Ciao a tutti, allora avrei il seguente problema. Ho una classe:
class CrossSection {
   public:
    // costruttore , distruttore etc.
    double getValue(double E);
    double integrate(double a, double b);  // <-- da implementare
  private:
    // dati usati internamente da getValue
}
mi serve calcolare l'integrale rispetto all'energia della sezione
d'urto (il cui valore, in funzione di E
viene restituito da getValue), e per questo volevo scrivere una
funzione membro integrate() che prende in ingresso i due estremi di
integrazione e restituisce il valore dell'integrale. Ho a disposizione
delle routine globali che usano vari algoritmi di integrazione
numerica:
typedef double (*f_ptr)(double )
int integrate_gauss (f_ptr, double a, double b, double *result, double
*erel)
int integrate_gauss_legendre (f_ptr, double a, double b, double
*result, double *erel)
int integrate_adapt_step (f_ptr, double a, double b, double *result,
double *erel, size_t maxiter)
etc..
ho provato a fare qualcosa del tipo:
double integrate(double a, double b) {
     double erel = 1e-8;
     double result;
     integrate_gauss(&getValue, a,b,&result,&erel);
     return result;
}
ma cosi' non compila perche' le funzioni integrate_xyz vogliono un
puntatore ad una funzione
"normale" e non ad una funzione membro...che tristezza. A me serve per
forza usare la funzione membro, perche' questa usa i dati specifici
dell'oggetto (ho degli array di sezioni d'urto), che vengono letti da
file dal costruttore della classe CrossSection. Quest'ultimo punto mi
aveva fatto escludere la
possibiita' di usare funzioni static (a queste dovrei passare come
minimo l'indirizzo dell'istanza di classe e di fatto sarebbe come usare
delle funzioni globali).
Ho pensato alla seguente possibilita':
Modificare il codice delle routine di integrazione in modo da accettare
puntatori a funzioni membro.
La classe CrossSection eredita public da CrossSectionBase, che ne
definisce l'interfaccia.
Il fatto e' che le stesse routines di integrazione mi serviranno
altrove nel codice, e in altre classi
... ok, per adesso sovraccarico tutte le funzioni in modo da accettare
puntatori tipo
double CrossSectionBase::*getValue( double )
... il fatto e' che le routines di integrazione richiamano a loro volta
altre funzioni di integrazione di base, a cui passano lo stesso
maledetto puntatore a funzione!...modificare tutto non sarebbe da poco
(senza contare tutto il tempo per eliminare i bachi e gli errori
introdotti nel processo), e non sono neppure certo di raggiungere
l'obbiettivo.
Qualcosa mi dice che deve esserci una soluzione piu' semplice (o piu'
raffinata, ma definitiva), ho come la sensazione di arrovellarmi su
qualcosa di banale, tuttavia non riesco a venirne a capo. Il problema
mi pare tuttavia abbastanza comune da aver trovato gia' una
soluzione... suggerimenti?
Grazie a tutti, giuliano

 soluzione... suggerimenti?
Questo è un problema che si presenta solo quando il codice è anacronistico.
Affinché f emuli A::f, è necessario appoggiarsi a una variabile statica 
o esterna ad f:
A* inst;
int f(int x, int y)
{
   return inst->f(x,y);
}
Ovviamente devi inizializzare inst prima di usare/passare f.
Kiuhnm