Puntatori a funzione

di il
5 risposte

Puntatori a funzione

Buonasera, spero che qualcuno qua dentro riesca a risolvere un problema di cui non sto capendo niente (premetto che non ho avuto tempo di andare in debug e analizzare la memoria eccetera). Ho fatto una classe B che ha come attributo privato un puntatore a funzione punt e come membro pubblico una funzione set che setta tale attributo in base al parametro puntatore a funzione passatole. Poi una classe A che ha come attributo privato un'istanza della classe B e come membro pubblico una funzione che chiama la set di cui sopra passando come parametro una funzione globale, non appartenente né a A né a B. Nella funzione set della classe A, subito dopo la valorizzazione di punt, chiamo la funzione puntata (dereferenzio punt) e tutto va come previsto. Quando però questo punt lo dereferenzio in un'altra funzione, ho un segmentation fault.
Qualcuno ha qualche idea?

Grazie

5 Risposte

  • Re: Puntatori a funzione

    La prima idea che mi viene è quella di vedere tutto il codice in questione ...
  • Re: Puntatori a funzione

    Sì, hai ragione, ma non ce l'ho sottomano. Appena posso lo posto.
  • Re: Puntatori a funzione

    Questo è il codice:
    
    #include <iostream>
    
    using namespace std;
    
    
    void stampa() {
    	cout << "Sono in stampa" << endl;
    }
    
    
    
    class B {
    public:
    	B();
    	void setCallback(void (*fp)());
    	void chiama();
    private:
    	void (*callback)();
    };
    
    
    
    B::B() {}
    
    void B::setCallback(void (*fp)()) {
    	cout << "Sono nella setCallback" << endl;
    	callback = *fp;
    	callback();
    }
    
    void B::chiama() {
    	callback();
    }
    
    
    class A {
    public:
    	A(B p);
    	void imposta();
    private:
    	B pe;
    };
    
    
    A::A(B p) {
    	pe = p;
    	
    }
    
    
    void A::imposta() {
    	pe.setCallback(stampa);
    }
    
    
    int main(int argc, char* argv[]) {
    	B x;
    	A y(x);
    	y.imposta();
    	x.chiama();
    	return 0;
    }
    
    E questo l'output dell'esecuzione:

    Sono nella setCallback
    Sono in stampa
    Segmentation fault
  • Re: Puntatori a funzione

    Attenzione al fatto che le istanze della B non sono le stesse ... modifica con
    
    class A {
    public:
       A(B &p);
       void imposta();
    private:
       B *pe;
    };
    
    
    A::A(B &p) {
       pe = &p;
    }
    
    
    void A::imposta() {
       pe->setCallback(stampa);
    }
  • Re: Puntatori a funzione

    Caspita hai ragione! Sono stato disattento.
    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
5 risposte