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 <void, BasicEnemy> aMemFunPtr = 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 argc, char * const argv[]) {
ig::BasicEnemy aBasicEnemy; // inside is calling PlayerCollision
// again, calling PlayerCollision:
std::mem_fun_t <void, ig::BasicEnemy> aMemFunPtr = 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.