Originariamente inviato da cadue
salve! sto facendo alcune prove per inserire delle callbacks nel mio progetto, ma ho un problema:

codice:
BasicEnemy::BasicEnemy(){
	void(*funz)();
	funz = &BasicEnemy::PlayerCollision;
}
l'errore è il seguente:
error C2440: '=': impossibile convertire da 'void (__thiscall BasicEnemy::* )(void)' a 'void (__cdecl *)(void)'
void PlayerCollision() è un membro pubblico della classe BasicEnemy. Come posso fare a far puntare "funz" al membro "void PlayerCollision()"? Grazie!
PlayerCollision non è di tipo void(*funz)(), perché essendo una funzione membro (non static) implicitamente tra i suoi argomenti ha anche l'indirizzo di un'istanza di BasicEnemy.

Per giocare coi puntatori membro, il C++ fornisce la funzione template std::mem_fun ed il tipo template std::mem_fun_t, ad esempio:
Codice PHP:
//
// Compiled and tested with:
// i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
//

#include <iostream>
#include <functional>

namespace ig{
    class 
BasicEnemy{
        public:
        
BasicEnemy (void);
        
void PlayerCollision (void);
    };
}

namespace 
ig{
    
BasicEnemy::BasicEnemy (){
        
std::mem_fun_t <voidBasicEnemyaMemFunPtr std::mem_fun (&BasicEnemy::PlayerCollision);
        
aMemFunPtr (this); // Automagically call this->PlayerCollision ();
    
}
    
void BasicEnemy::PlayerCollision (){
        
std::cout << "Hello from BasicEnemy::PlayerCollision" << std::endl;
    }
}

int main (int argcchar * const argv[]) {
    
ig::BasicEnemy aBasicEnemy// inside is calling PlayerCollision
    
    // again, calling PlayerCollision:
    
std::mem_fun_t <voidig::BasicEnemyaMemFunPtr std::mem_fun (&ig::BasicEnemy::PlayerCollision);
    
aMemFunPtr (&aBasicEnemy); // Automagically call aBasicEnemy.PlayerCollision (); 
    
return 0;

Osserva che le variabili locali aMemPtr definite nel costruttore ed in main, sono dei funtori associati al metodo ig::BasicEnemy::PlayerCollision.