Newsgroup: it.comp.lang.c++
Titolo: puntatore a funzione come parametro di una funzione in una classe

Salve,
non riesco a venire a capo di questa differenza, perchè il primo esempio 
funziona e il secondo no?
 /////////////////////////////////  uno.cpp
#include <iostream>
void f1(void)
{
printf("ciao mondo");
}
void test(void (*funzione)(void) )
{
funzione();
}
int main()
{
test(f1);
return 0;
}
//////////////////////////////////////////// due.cpp
#include <iostream>
class prova
{
public:
void f1(void);
void test(void (*funzione)(void) );
private:
};
void prova::f1(void)
{
printf("ciao mondo");
}
void prova::test(void (*funzione)(void) )
{
funzione();
}
int main()
{
prova p1;
p1.test(p1.f1);
return 0;
}

 funziona e il secondo no?
Domanda da FAQ.
========================
#include <iostream>
class prova
{
public:
	void f1(void);
	void test(void (prova::*funzione)(void) );
private:
};
void prova::f1(void)
{
	printf("ciao mondo");
}
void prova::test(void (prova::*funzione)(void) )
{
	(this->*funzione)();
}
int main()
{
	prova p1;
	p1.test(&prova::f1);
	return 0;
}
========================
Kiuhnm

 Domanda da FAQ.
[snip]
risposta da faqoff... flydown kiuhnm.
fadeh 

 risposta da faqoff... flydown kiuhnm.
Uh?
Kiuhnm

> risposta da faqoff... flydown kiuhnm.
Tradotto dal klingon: non era una risposta particolarmente gentile...


In realtà è il commento di fadeh che è particolarmente odioso.
Kiuhnm ha dato una risposta esauriente con tanto di codice a una domanda 
che *è* una FAQ in quanto viene posta quasi regolarmente (direi 
all'incirca con cadenza mensile) in una forma o nell'altra.

> In realtà è il commento di fadeh che è particolarmente odioso.
mea culpa ho letto male la risposta e ho risposto una cazzata.
P.S.: Pero' mi faceva ridere faqoff e non c'ho pensato a rileggere con 
attenzione :)
Ciao,
fadeh 

 mea culpa ho letto male la risposta e ho risposto una cazzata.
Hai sottovalutato la bontà del mio quoting, più che altro: non sono 
solito scrivere la risposta in cima alla parte quotata ;)
Kiuhnm

Ok, grazie come dici tu funziona, ma il mio era un problema + generale e non 
riesco ad adattare la tua soluzione.
Io devo passare una funzione da me creata ad una funzione esterna, che 
quindi non posso toccare (nel mio caso un API di win). Il tutto nella mia 
classe. Sono sicuro di essermi espresso male quindi posterò il codice, nel 
caso qualcuno voglia darci un'occhiatina.
/// PHStartConsole.h
#pragma once
#include <windows.h>
#include <string>
#include "resource.h"
using namespace std;
class PHStartConsole
{
 public:
  PHStartConsole();
  ~PHStartConsole();
  void Save();
 private:
  HWND HForm;
  BOOL CALLBACK DlgProc(HWND Finestra, UINT Msg, WPARAM Parametro1, LPARAM 
Parametro2); <==== funzione da passare come parametro
};
/// PHStartConsole.cpp
#include "PHStartConsole.h"
BOOL CALLBACK PHStartConsole::DlgProc(HWND Finestra, UINT Msg, WPARAM 
Parametro1, LPARAM Parametro2)
{
  // [cut]
}
void PHStartConsole::Save()
{
      // [cut]
}
PHStartConsole::PHStartConsole()
{
  // [cut]
 DialogBoxParam(0,MAKEINTRESOURCE(101),0,DlgProc,0); // <=================== 
errore sul 4° parametro
}
PHStartConsole::~PHStartConsole()
{
  // [cut]
}
Naturalmente se la dlgprog la definisco fuori dalla classe tutto fila 
liscio, ma non mi piace come soluzione.... 

 classe.
 
http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2

 liscio, ma non mi piace come soluzione.... 
Supponi di avere
1) una classe A definita come segue:
class A
{
   int incrementMe;
public:
   void inc() { ++incrementMe; }
};
2) due oggetti di tipo A:
A obj1, obj2;
3) due chiamate a funzione:
obj1.inc();
obj2.inc();
Domande:
1) Le due chiamate fanno riferimento alla stessa funzione?
2) Se la funzione è la stessa, come mai vengono incrementate variabili 
differenti?
3) Se si scrivesse semplicemente "inc()" e il compilatore capisse che si 
fa riferimento alla funzione della classe A, quale variabile incrementMe 
verrebbe incrementata?
Kiuhnm

 classe.
Dai un'occhiata a 
http://boost.org/libs/bind/bind.html
 (ma ci sono altre 
alternative).
  bye
	av.

 solito scrivere la risposta in cima alla parte quotata ;)
eh :D
fadeh