PDA

Visualizza la versione completa : [C++] Oggetto con puntatore a funzione


leonard_shelby
13-10-2008, 00:55
Sia una classe SomeClass al cui interno è definita il puntatore a funzione:



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:



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:

oregon
13-10-2008, 07:52
Il puntatore e' il membro ptrFunc, quindi, se lo devi assegnare, semplicemente

ptrSomeClass->ptrFunc = functionx;

mondobimbi
13-10-2008, 10:53
inoltre functionx deve essere del tipo giusto, cioè un puntatore ad una funzione membro di SomeClass




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

leonard_shelby
14-10-2008, 00:48
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):



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


nel main:



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:



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?

oregon
14-10-2008, 07:34
ptrFuncMembro = &SomeClass::functionx;

leonard_shelby
16-10-2008, 00:39
Originariamente inviato da oregon


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):



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:



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) :dottò:

oregon
16-10-2008, 07:53
Un attimo ... dato che la funzione membro non e' statica, devi avere un oggetto della classe SomeClass per usare il puntatore ...

leonard_shelby
19-10-2008, 20:00
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



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)'

Loading