Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

Puntatori a funzione

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

Re: Puntatori a funzione

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.

Re: Puntatori a funzione

22/09/2020, 13:17

Perfetto grazie mille, ho risolto :D
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.