Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95

    [C++]puntatore ad un membro

    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!

  2. #2

    Re: [C++]puntatore ad un membro

    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    95
    urca...veramente più complesso di quanto immaginassi! grazie per il codice, mi sarà senz'altro utile!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.