Puntatori a funzione
Salve, mi servirebbe una mano con i puntatori a funzione. Vorrei chiamare casualmente dei metodi di una classe usando le librerie rand() e . Mi ritrovo in questa situazione
File .h :
class cartellino : public casella {
public:
cartellino();
void EstraiCartellino();
virtual void Funzione0(double prova);
virtual void Funzione1(double prova);
virtual void Funzione2(double prova);
virtual void Funzione3(double prova);
// ecc...
protected:
std::vector ListaFunzioni;
};
File .cc :
cartellino::cartellino(){
ListaFunzioniIniziale.push_back(&cartellino::Funzione0);
ListaFunzioniIniziale.push_back(&cartellino::Funzione1);
ListaFunzioniIniziale.push_back(&cartellino::Funzione2);
//ecc...
}
void cartellino::EstraiCartellino(){
double temp;
temp=rand();
temp=(ListaFunzioni.size()*temp/RAND_MAX);
*(ListaFunzioni[temp])(0.); //il problema è qui
}
void cartellino::Funzione0(double prova){}
void cartellino::Funzione1(double prova){}
void cartellino::Funzione2(double prova){}
Non so come chiamare le funzioni contenute nel vettore ListaFunzioni. La scrittura riportata è scorretta e, oltre a non sapere il perchè lo sia, non riesco a trovare "per tentativi" quella corretta. Mi dà sempre errore in fase di compilazione! Grazie in anticipo
File .h :
class cartellino : public casella {
public:
cartellino();
void EstraiCartellino();
virtual void Funzione0(double prova);
virtual void Funzione1(double prova);
virtual void Funzione2(double prova);
virtual void Funzione3(double prova);
// ecc...
protected:
std::vector
};
File .cc :
cartellino::cartellino(){
ListaFunzioniIniziale.push_back(&cartellino::Funzione0);
ListaFunzioniIniziale.push_back(&cartellino::Funzione1);
ListaFunzioniIniziale.push_back(&cartellino::Funzione2);
//ecc...
}
void cartellino::EstraiCartellino(){
double temp;
temp=rand();
temp=(ListaFunzioni.size()*temp/RAND_MAX);
*(ListaFunzioni[temp])(0.); //il problema è qui
}
void cartellino::Funzione0(double prova){}
void cartellino::Funzione1(double prova){}
void cartellino::Funzione2(double prova){}
Non so come chiamare le funzioni contenute nel vettore ListaFunzioni. La scrittura riportata è scorretta e, oltre a non sapere il perchè lo sia, non riesco a trovare "per tentativi" quella corretta. Mi dà sempre errore in fase di compilazione! Grazie in anticipo

Risposte
Sarebbe meglio inserire il codice usando il tag CODE in modo da preservarne la formattazione e non rischiare di inserire involontariamente alcuni tag.
Un puntatore ad una funzione membro è qualcosa di molto complicato per diverse ragioni. Prima di tutto le funzioni membro contengono un argomento aggiuntivo nascosto: l'istanza della classe che corrisponde al puntatore this. E' quindi necessario fare le chiamate a queste funzioni a partire da una istanza della classe. Il metodo corretto è una dei seguenti (quando si ha accesso a [tt]this[/tt]):
Dopodiché c'è la possibilità che la funzione sia, come nel tuo caso, [tt]virtual[/tt]. Lo standard richiede che se questo puntatore è usato da una istanza di una classe figlia, deve richiamare la corrispondente funzione della classe figlia. La logica del suo funzionamento è quindi un po' più complicata di una puntatore.
Un'alternativa a lavorare con i puntatori a funzioni è quella di fare uso della classe std::function ed eventualmente delle lambda.
Un puntatore ad una funzione membro è qualcosa di molto complicato per diverse ragioni. Prima di tutto le funzioni membro contengono un argomento aggiuntivo nascosto: l'istanza della classe che corrisponde al puntatore this. E' quindi necessario fare le chiamate a queste funzioni a partire da una istanza della classe. Il metodo corretto è una dei seguenti (quando si ha accesso a [tt]this[/tt]):
(this->*(ListaFunzioni[temp]))(0.0); (*this.*(ListaFunzioni[temp]))(0.0);
Dopodiché c'è la possibilità che la funzione sia, come nel tuo caso, [tt]virtual[/tt]. Lo standard richiede che se questo puntatore è usato da una istanza di una classe figlia, deve richiamare la corrispondente funzione della classe figlia. La logica del suo funzionamento è quindi un po' più complicata di una puntatore.
Un'alternativa a lavorare con i puntatori a funzioni è quella di fare uso della classe std::function ed eventualmente delle lambda.
Perfetto grazie mille, ho risolto
