Newsgroup: it.comp.lang.c++
Titolo: Puntatori a funzioni membro

Salve a tutti,
stavo scrivendo una classe che creava una finestra window, ma ho avuto dei
problemi...
Nel costruttore della classe creo la finestra tramite la funzione
CreateWindow, e proprio quì ho dei problemi:
{
  WndClass.style         = CS_DBLCLKS | CS_SAVEBITS;
  WndClass.lpfnWndProc   = (WNDPROC)ProcFin;
  WndClass.cbClsExtra    = 0 ;
  WndClass.cbWndExtra    = 0 ;
  WndClass.hInstance     = hInstance ;
  WndClass.hIcon         = NULL;
  WndClass.hCursor       = NULL;
  WndClass.hbrBackground = NULL;
  WndClass.lpszMenuName  = NULL;
  WndClass.lpszClassName = "Window" ;
  RegisterClass(&WndClass);
  PWin = CreateWindow("Window", "Main Window", NULL, 0, 0, 0, 0, NULL, NULL,
hInstance, NULL);
 ...
}
La struttura WndClass ha bisogno dell'indirizzo di una funzione WNDPROC da
chiamare quando arrivano dei messaggi alla finestra.
ProcFin è una funzione WNDPROC dichiarata all'intero della classe.
Al secondo rigo mi dà questo errore:
error C2440: "cast di tipo": impossibile convertire da "overloaded-function"
a "WNDPROC"
        Nessuna delle funzioni dell'ambito corrente aventi questo nome
corrisponde al tipo di destinazione
Più o meno riesco a capire il perchè, ossia perchè finchè non viene
istanziato nessun oggetto della mia classe quella funzione è come se non
esistesse. In pratica non saprebbe quale funzione chiamare riferita a un
particolare oggetto.
Ho quindi sostituito ProcFin con this->ProcFin, sperando che la cosa
funzionasse... :-( purtroppo no!
Come posso fare?
Ho avuto lo stesso problema per creare dei thread su delle funzioni membro,
ma ero riuscito a risolvere in questo modo quì:
Dichiaro friend la funzione ausiliaria affinchè possa accedere a FunzThread
che è privata.
class Pippo
{  friend void RunFunzThread(Pippo *);
    private:
   void FunzThread();
}
Nel costruttore creo il thread lanciando la funzione ausiliaria passandogli
come parametro il puntatore all'oggetto corrente
Pippo::Pippo
(
)
{
  CreateThread(.... ..., RunFunzThread, this, .... ....);
}
Questa è la funzione membro della classe che dovrebbe essere eseguita in
thread
void Pippo::FunzThread
(
)
{  .....
}
La funzione ausiliaria lancia la funzione membro che viene eseguita in un
thread a parte
void RunFunzThread
( Pippo * P
)
{
  P->FunzThread();
}
In questo modo (brutto o meno) sono riuscito a fare ciò che volevo, solo che
non posso farlo nel problema che vi ho posto perchè non posso passare alla
funzione ProcFin il puntatore all'oggetto corrente (deve essere una
WNDPROC)!
Scusate la lunghezza del post, ma volevo spiegarvi bene la situazione...non
so più cosa inventarmi! :-(
Grazie
Giovanni.


Credo che questa domanda sia più azzeccata su it.comp.programmare.win32
Ad ogni modo verifica che la tua ProcFin sia stata dichiarata come segue:
LRESULT CALLBACK ProcFin(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
Ciao
Andrea

 Credo che questa domanda sia più azzeccata su it.comp.programmare.win32
La posterò anche li, ma in verità la domanda era su come fare a specificare
l'indirizzo di una funzione membro di una classe che serviva alla mia
struttura WNDCLASS...mi sembra che si tratti di C++ questo...!

 
risposta brevissima: non si può.
-- 
"Dato che sono un duro non mi aspetto di piacervi, ma piu' mi odierete e 
piu' imparerete. Io sono un duro pero' sono giusto, qui non si fanno 
distinzioni razziali, qui si rispetta la gentaglia come negri, ebrei, 
italiani e messicani: qui vige l'uguaglianza non conta un cazzo nessuno!"


Purtroppo l'avevo immaginato :-(
Vabbè, grazie per avermi dato la sicurezza, troverò una qualche magagna per
aggirare il problema!
Giovanni.

 
in realtà la soluzione c'è, ma penso che te l'abbiano già data in 
it.comp.programmare.win32.


 struttura WNDCLASS...mi sembra che si tratti di C++ questo...!
Cosi' cosi', nel senso che il trucco lo conosci gia', perche' lo hai
descritto nel tuo primo messaggio. Quello che manca e' sapere se
qualcuno dei parametri della signature che ti e' stata indicata in un
altro messaggio e' utilizzabile per passare "di straforo" un puntatore
all'oggetto su cui vuoi chiamare la funzione membro, e questo e' un
problema specifico di Windows.
Ciao,
Nicola