2013-05-27 27 views
16

Bu örnekte, çalışma zamanı sırasında değiştirmek istediğim üye işlevine işaretçiyi kullanma kodum var, ancak çalışmasını sağlayamıyorum. Zaten this->*_currentPtr(4,5)(*this)._currentPtr(4, 5) denedim. İşaretçiyi aynı sınıf içinde yönteme çağırmanın uygun yolu nedir?C++: İşaretçi işlevi işlevi işaretçi

hata : ifadesi olmalıdır (işaretçi arası) fonksiyonu tipi

Sen foo s geliyor sınıf derleyici söylemek gerekir
#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

Sorunlarınız ve aldığınız hata iletileri nelerdir? –

cevap

23

(aksi takdirde onlar sanıyor küresel etki alanındaki fonksiyonlar):

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

ve burada parantez grubu gerekir:

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

Yardımın bana yardımcı oldu. Ama kafam karıştı, neden '&' operatörüne ihtiyaç var, fonksiyonun adres olarak ele alındığını düşündüm. – ashur

+2

@ashur Bu, normal işlevler için geçerlidir, ancak üye işlevleri için geçerli değildir. Ve ikincisi düzenli işaretçiler değildir. – jrok

+2

@ashur [Bu makale] (http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible) üye işaretçilerinin giriş ve çıkışları hakkında ilginç bir bilgi için bakın. – jrok

İlgili konular