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

    [C++] Oggetto con puntatore a funzione

    Sia una classe SomeClass al cui interno è definita il puntatore a funzione:

    codice:
    class SomeClass
    {
    ...
    public:
    void (*ptrFunc)(int z);
    ...
    Dal main dichiaro un oggetto di tipo SomeClass e voglio richiamare il puntatore a funzione ptrFunc, lo tento di fare come segue:

    codice:
    SomeClass* ptrSomeClass = new SomeClass;
    (ptrSomeClass->*ptrFunc) = functionx;
    ovviamente sbaglio qualcosa perchè mi dice che non vede nemmeno il puntatore ptrFunc definito nel file dove viene definita la classe SomeClass (SomeClass.h)
    suggerimenti...? :master:

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Il puntatore e' il membro ptrFunc, quindi, se lo devi assegnare, semplicemente

    ptrSomeClass->ptrFunc = functionx;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    inoltre functionx deve essere del tipo giusto, cioè un puntatore ad una funzione membro di SomeClass

    codice:
    typedef void  (SomeClass::* PFM) ( int );
    
    class SomeClass
    {
    ...
    public:
      PFM ptrFunc ;
    ...
    ...
    
      ptrSomeClass->ptrFunc = functionx;
    dove in questo esempio functionx è una funzione membro che accetta un int e non ritorna.
    Il typedef ti permette di avere una dichiarazione più umana dei puntatori a funzione membro.

    ciao
    sergio

  4. #4
    di solito a un puntatore a funzione assegno una funzione (con stessi parametri i/o)

    ora che usavo un puntatore a funzione membro non dovrei assegnargli una funzione membro? ho provato a fare questa cosa (come dice mondobimbi, la mia functionx è una funzione membro che accetta un int e non ritorna e l'ho definita nella classe SomeClass):

    codice:
    class SomeClass
    {
        ...
        public:
    	void functionx(int z) { };
    ...
    nel main:

    codice:
    typedef void (SomeClass::* PFM)(int);
    PFM ptrFuncMembro;
    SomeClass* ptrSomeClass = new SomeClass;
    ptrFuncMembro =	ptrSomeClass->functionx;
    al che mi dice : "E2235 Member function must be called or its address taken"
    Ho provato ad assegnargli invece che una funzione membro functionx, un puntatore di funzione membro definito nella classe SomeClass, quindi una cosa del tipo:

    codice:
    ptrFuncMembro = ptrSomeClass->PFMdefinitoInSomeClass;
    ma il mio intento era assegnare al puntatore di funzione membro creato nel main , la funzione membro della classe (SomeClass) , si può fare?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    codice:
    ptrFuncMembro =	&SomeClass::functionx;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Originariamente inviato da oregon
    codice:
    ptrFuncMembro =	&SomeClass::functionx;

    ok, ora sto usando il puntatore creato nel main, in modo che usi la funzione membro a cui punta in modo da fare l'operazione che essa fa, ad esempio mi aspettavo qualcosa del tipo (cioè simile al caso di puntatori a funzioni definite in main):

    codice:
    int somma(int a, int b);
    
    ...
    
    int (*puntatore)(int ,int); int risultato;
    puntatore = somma;
    risultato = puntatore(2,4);
    
    ...
    
    int somma(int a, int b)
    {
      return a+b;
    }
    così ho tentato qualcosa del tipo:

    codice:
    typedef void (SomeClass::* PFM)(int);
    PFM ptrFuncMembro;
    ptrFuncMembro =	&SomeClass::functionMembro;
    cout<<"\nDa main chiamo il puntatore alla funzione membro che restituisce.." <<ptrFuncMembro(55)<<endl;
    ma dice il compilatore dà responso negativo (E2314 Call of nonfunction) , anche con *ptrFuncMembro(55) non compila (E2069 Illegal use of member pointer)

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Un attimo ... dato che la funzione membro non e' statica, devi avere un oggetto della classe SomeClass per usare il puntatore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon
    Un attimo ... dato che la funzione membro non e' statica, devi avere un oggetto della classe SomeClass per usare il puntatore ...
    rispetto a prima ho provato a usare un oggetto di SomeClass e poi assegnarlo a ptrFuncMembro

    codice:
            typedef void (SomeClass::* PFM)(int);
    	PFM ptrFuncMembro;
    	SomeClass *oggettoSomeClass = new SomeClass;
    	ptrFuncMembro = &(oggettoSomeClass->functionMembro);
    e mi dà il seguente errore

    E2034 Cannot convert 'void (* (_closure )(int))(int)' to 'void (SomeClass::*)(int)'

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.