2013-05-27 18 views
16

Ho questo codice di esempio dell'uso del puntatore alla funzione membro, che voglio modificare durante il runtime, ma non riesco a farlo funzionare. Ho già provato this->*_currentPtr(4,5)(*this)._currentPtr(4, 5). Qual è il modo corretto di chiamare il puntatore al metodo all'interno della stessa classe?C++: funzione membro chiamante tramite puntatore

L'errore: espressione deve avere (pointer-to) tipo di funzione

#include <iostream> 
#include <cstdlib> 

class A { 

public: 

    void setPtr(int v); 
    void useFoo(); 

private: 
    typedef int (A::*fooPtr)(int a, int b); 

    fooPtr _currentPtr; 

    int foo1(int a, int b); 
    int foo2(int a, int b); 
}; 

void A::setPtr(int v){ 
    if(v == 1){ 
     _currentPtr = foo1; 
    } else { 
     _currentPtr = foo2; 
    } 
} 

void A::useFoo(){ 

    //std::cout << this->*_currentPtr(4,5); // ERROR 
} 

int A::foo1(int a, int b){ 
    return a - b; 
} 

int A::foo2(int a, int b){ 
    return a + b; 
} 

int main(){ 

    A obj; 

    obj.setPtr(1); 
    obj.useFoo(); 

    return 0; 
} 
+0

Quali sono i problemi e i messaggi di errore che si ricevono? –

risposta

23

È necessario dire al compilatore quale classe i foo s sono provenienti da (altrimenti si pensa che siano funzioni di portata globale):

void A::setPtr(int v){ 
    if(v == 1){ 
     _currentPtr = &A::foo1; 
        // ^^^^ 
    } else { 
     _currentPtr = &A::foo2; 
        // ^^^^ 
    } 
} 

e avete bisogno di un insieme di parentesi qui:

std::cout << (this->*_currentPtr)(4,5); 
      //^    ^
+1

Grazie che mi ha aiutato. Ma sono confuso perché è necessario l'operatore '&', ho pensato che la funzione fosse considerata come indirizzo. – ashur

+2

@ashur Questo vale per le normali funzioni, ma non per le funzioni dei membri. E questi ultimi non sono puntatori regolari. – jrok

+2

@ashur Vedi [questo articolo] (http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible) per una lettura interessante sui dettagli dei puntatori ai membri. – jrok

Problemi correlati