Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++], Puntatore a funzione

    Non riesco a capire come si usano i puntatori a funzione in C++. Ecco una porzione di codice:

    codice:
        ...
        void (*Puntatore)();
        Puntatore= FunzioneDaPuntare;
    }
    
    void wxFViaggioImp::FunzioneDaPuntare() {
    }
    
    cpp:129: error: argument of type `void (wxFViaggioImp::)()' does not match `void (*)()'
    In pratica la funzione FunzioneDaPuntare() deve essere puntata per mezzo del puntatore Puntatore. In compilazione ottengo l'errore scritto sopra. Cosa sto sbagliando?

  2. #2
    wxFViaggioImp::FunzioneDaPuntare è un metodo statico o d'istanza?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    d'istanza. Attenzione che il puntatore deve poter raggiungere il metodo di un'altra classe.
    Praticamente ciò che a me serve è una cosa simile alla funzione associata ad un evento.
    Sono riuscito a farlo funzionare in C ma non tra due classi C++.

  4. #4
    Il punto è che un metodo d'istanza non è una semplice funzione (che di fatto è caratterizzata da un semplice indirizzo), ma una cosa più complicata (funzione, puntatore a this ed eventualmente informazioni sul tipo di this). Per gestire queste complicazioni di solito si usano classi specializzate che incapsulano indifferentemente puntatori a funzione e a membri d'istanza, come i signals della libreria boost.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Diavolo com'è complicato! In pascal la cosa è a dir poco banale.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da denis76
    Diavolo com'è complicato! In pascal la cosa è a dir poco banale.
    Perchè tu in Pascal ottieni l'indirizzo di un metodo di una istanza facilmente?

    Non sarà che con il Pascal fai una "cosa diversa" ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    No no, ti posso garantire che la cosa è molto semplice da fare.
    Ecco un frammento di codice (un po' disordinato).

    codice:
    type TSincProcedure= procedure() of Object;
    
    // In questa classe definisco il puntatore e se è definito lo invoco
    TNERigaLog: TSincProcedure;
        published
          property OnRigaLog: TSincProcedure read TNERigaLog write TNERigaLog;
    
      ...
      if Assigned(TNERigaLog) then TNERigaLog();
      ...
    
    
    // Questa è una classe che instanzia TThLettoreFinger ed associa il puntatore alla funzione Log
    TThLettoreFinger.OnRigaLog:= @Log;
    In C è molto facile, in C++ credo che si debbano usare gli slot come consigliato sopra. Se ci fosse una strada più semplice sono tutt'orecchi.

  8. #8
    è un po' che non uso puntatori a funzioni membro, ma io la scriverei così

    codice:
        ...
        typedef void ( wxFViaggioImp::*Puntatore)();
        Puntatore f = FunzioneDaPuntare;
    }
    
    void wxFViaggioImp::FunzioneDaPuntare() {
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.