Puntatori a funzione

Messaggioda Pic143 » 19/09/2020, 20:17

Salve, mi servirebbe una mano con i puntatori a funzione. Vorrei chiamare casualmente dei metodi di una classe usando le librerie rand() e <vector>. 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<void (cartellino::*)(double)> 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 :D
Pic143
Starting Member
Starting Member
 
Messaggio: 20 di 48
Iscritto il: 05/02/2018, 11:55

Re: Puntatori a funzione

Messaggioda apatriarca » 20/09/2020, 17:07

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 this):
Codice:
(this->*(ListaFunzioni[temp]))(0.0);
(*this.*(ListaFunzioni[temp]))(0.0);

Dopodiché c'è la possibilità che la funzione sia, come nel tuo caso, virtual. 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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5482 di 10438
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Puntatori a funzione

Messaggioda Pic143 » 22/09/2020, 13:17

Perfetto grazie mille, ho risolto :D
Pic143
Starting Member
Starting Member
 
Messaggio: 21 di 48
Iscritto il: 05/02/2018, 11:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite