2013-05-27 25 views
16

Mam ten przykładowy kod użycia wskaźnika do funkcji składowej, którą chcę zmienić w czasie wykonywania, ale nie mogę sprawić, żeby działało. Próbowałem już this->*_currentPtr(4,5)(*this)._currentPtr(4, 5). Jaki jest właściwy sposób wywoływania wskaźnika do metody wewnątrz tej samej klasy?C++: Wywołanie funkcji członka za pomocą wskaźnika

Błąd: wyrażenie musi mieć (pointer-to-) Typ funkcja

#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

Jakie są problemy i komunikaty o błędach, które otrzymujesz? –

Odpowiedz

23

Musisz poinformować kompilator której klasy foo s jadą (inaczej myśli, że jesteś funkcje z zakresu globalnego):

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

i trzeba zestaw nawiasach tutaj:

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

Dzięki, które mi pomogły. Ale jestem zdezorientowany, dlaczego potrzebny jest operator '&', pomyślałem, że funkcja jest traktowana jako adres. – ashur

+2

@ashur Dotyczy to normalnych funkcji, ale nie funkcji składowych. A te ostatnie nie są regularnymi wskazówkami. – jrok

+2

@ashur Zobacz [ten artykuł] (http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-TheFastest-Possible) dla interesującej lektury na temat tajników podpowiedzi członków. – jrok

Powiązane problemy