Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]puntatore void a funzione invoke

    ciao.
    Ho un puntatore a void *void vFunction che punta ad una funzione che come parametro accetta una stringa .
    Come faccio ad invocare la funzione?
    in vc++ win.
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Castalo ad un puntatore a funzione corretto.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Vorrei richiamare una funzione come se fosse generica ,dopo avergli assegnato un puntatore da dentro una classe , non è possibile?
    ho un codice cosi:
    codice:
    class Derived{
    void Derived::initialize()
    {
    	static registerInFactory<Base, Derived, Base::BASE_KEY_TYPE> registerMe("xxx",(void*)xxx);//registro il puntatore a funzione e lo metto in una mappa tralascio il codice
    	//void *v =  mappa["NomeFunzione"];
           //invoco la funzione???????????
    }
    void  Derived::xxx(std::string strData)
    {
    	afxmessagebox....
    }
    }
    adesso vorrei che se estraggo il puntatore dalla mappa con un indice string posso invocare la funzione puntata dal puntatore a void nella mappa dal main o comunque dall'esterno.
    E' possibile?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Spiego meglio.
    Sto effettuando un parser sax per xml , ho fatto in modo che quando il parser trova un determinato tag di struttura xml nell' open tag di sax instanzio una classe del tipo di quel tag, successivamente per ogni tag dato nel close chiamo una funzione che automaticamente mi setta i dati.
    In questa maniera leggol'xml e lo converto in classi e dati.
    Devo pero' riuscire a registrare le classi e le funzioni .
    Per le classi ci sono riuscito , come da post precedente ho un puntatore a funzione statica di un pattern abstract factory.
    Per le funzioni no , vorrei quindi riuscire a creare un meccanismo di registrazione delle funzioni (mettere in una mappa i puntatori a funzione)per poterle richiamare automaticamente dall classe creata .
    Una roba del genere:
    CurrentClass.callFunction("data");
    simile alla reflection.
    Con un metodo statico sono riuscito a creare questo meccanismo , ma non per un metodo non statico , una funzione membro normale per intenderci.
    Che differenza c'è?
    co,e posso salvare un indirizzo ad una funzione in una mappa e richiamarla all'occorrenza?
    grazie.

  5. #5
    Vedi la seguente:
    Per giocare coi puntatori membro, il C++ fornisce la funzione template std::mem_fun ed il tipo template std::mem_fun_t, ad esempio:
    http://forum.html.it/forum/printthre...readid=1180516

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    fuori dalla funzione
    codice:
    typedef void func(std::string* s);
    dentro la funzione:
    codice:
    void* ptr = mappa["NomeFunzione"];
    func *f = (func*)ptr;
    f(null); // settare l'argomento corretto
    quando inizializzi i valori di "mappa" devi usare puntatori a funzioni globali e non ai metodi di una classe, altrimenti il discorso è + complicato.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie , ma io sto cercando qualcosa che instanzi un oggetto derivato da una classe base dal nome della classe e ne scateni le funzioni dal nome delle funzioni.
    In pratica:
    pC1 =factory::instance().Create("CClasse1");
    pC1->Invoke("funzionexxx");

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    non credo che esista una cosa del genere in c++.
    dovresti scriverti tu la factory che in base al nome crea l'istanza giusta e chiama il metodo giusto.

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da giuseppe500
    Grazie , ma io sto cercando qualcosa che instanzi un oggetto derivato da una classe base dal nome della classe e ne scateni le funzioni dal nome delle funzioni.
    In pratica:
    pC1 =factory::instance().Create("CClasse1");
    pC1->Invoke("funzionexxx");
    O passi al .NET che nel namespace Reflection ha proprio questa robaccia che ti serve.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da bitman
    codice:
    void* ptr = mappa["NomeFunzione"];
    func *f = (func*)ptr;
    f(null); // settare l'argomento corretto
    E' illegale fare un cast da puntatore a funzione a void* e viceversa.

    http://www.parashift.com/c++-faq-lit....html#faq-33.7
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.