Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C++] Passaggio metodo classe come funzione handler

    Ciao a tutti, ho un problema con un pezzo di codice su C++ in particolare ho un metodo di una classe che prende come parametro un indirizzo di una funzione e la usa come handler in caso si verifica un determinato evento; adesso io volevo passare a questa funzione non un indirizzo di una funzione ma di un metodo di una classe ovvero, faccio un esempio con del codice:

    Classe Receiver
    codice:
    class Receiver {
    
    
        public:
            Receiver();
            ~Receiver();
            void StartRecvMessages();
    
    
        private;
             void message_handler( MyObj& obj );
            
    };

    File Receiver.cpp
    codice:
    void msg_handler ( MyObj& obj );
    
    
    void  Receiver::StartRecvMessages()  {
        // ...
    
    
        SocketReceiver r;
        MyObj obj;
    
    
        // in questo modo non compila suppongo perchè devo fare riferimaneto
        // in qualche modo al fatto che message_handler è un metodo della classe Receiver
        // ma in che modo?
        r.async_receive<MyObj>( &message_handler );
    
    
        // neppure se metto in questo modo che avrebbe più senso, funziona
        r.async_receive<MyObj>( &(Receiver::message_handler) );
    
    
        // mentre così funziona
        r.async_receive<MyObj>( &msg_handler );
    
    
        //...
    
    
    }
    
    
    void Receiver::message_handler( MyObj& obj ) {
        //do somethings
    }
    
    
    void msg_handler ( MyObj& obj ) {
        //do somethings
    }

    Ci potrebbero essere degli errori perchè ho scritto il codice semplificato solo per fare un esempio e non è compilabile.
    Purtroppo la parte del metodo async_receive ha solo quel parametro ed è una funzione di una libreria che devo usare, quindi non posso aggiungergli parametri.

    Qualcuno che ha una dritta?
    grazie mille ragazzi
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Un metodo non appartiene alla classe, ma all'oggetto istanziato.
    A te serve un metodo statico (static method).
    Cerca su google.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Un metodo non appartiene alla classe, ma all'oggetto istanziato.
    A te serve un metodo statico (static method).
    Cerca su google.
    Ok...intendi una cosa simile quindi...modificando il metodo della classe Receiver così

    codice:
    static void message_handler ( MyObj& obj );
    di conseguenza anche l'implementazione nella classe .cpp

    codice:
    static void Receiver::message_handler ( MyObj& obj ) {
    
    }
    e la chiamata alla async_recv come sarebbe??

    Avevo anche provato in questo modo ma, forse sbagliando non sono riuscito a far funzionare nulla.
    Ultima modifica di MrX87; 30-05-2014 a 16:51
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Metodo di una funzione ?

    Sì utilizza un metodo statico e funziona ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Metodo di una funzione ?

    Sì utilizza un metodo statico e funziona ...
    Okay usando un metodo statico effettivamente funziona, però....in un metodo statico non ho modo di fare riferimento ai membri della classe, quindi effettivamente non ci guadagno molto a farlo!?
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da MrX87 Visualizza il messaggio
    Okay usando un metodo statico effettivamente funziona, però....in un metodo statico non ho modo di fare riferimento ai membri della classe, quindi effettivamente non ci guadagno molto a farlo!?
    Puoi usare qualsiasi membro static.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    In C++ un puntatore a funzione può solo puntare o ad una funzione libera o ad un membro static (che all'atto pratico è sostanzialmente una funzione libera in un namespace particolare); non puoi passare dentro un puntatore a funzione un puntatore ad un metodo di istanza, dato che questo richiederebbe un puntatore a funzione più un puntatore all'istanza su cui dovrebbe operare, e le due cose ovviamente non ci stanno nello spazio destinato ad un solo puntatore a funzione.

    Se controlli l'interfaccia del callback, da C++11 puoi specificare che vuoi ricevere un oggetto std::function, che, tramite type erasure, consente di portarsi dentro qualunque oggetto "chiamabile" (puntatore a funzione, funzione lambda, metodo d'istanza bindato ad un'istanza specifica, functore, ...). In alternativa, se si tratta di un callback fissato (ad esempio che dipende da una libreria C), normalmente oltre al callback è possibile specificare un dato di "contesto" (normalmente un void *) che viene passato come argomento del callback. In genere questo da lato C++ viene sfruttato per metterci dentro l'istanza su cui operare, per cui passerai come callback un metodo statico che fa il cast del "contesto" al tipo appropriato e ci richiama sopra il metodo che vuoi.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.