2013-05-27 3 views
16

이 예제 코드는 멤버 함수에 대한 포인터를 사용하여 런타임 중에 변경하려고하지만이 함수를 작동시키지 못합니다. 이미 시도했습니다 this->*_currentPtr(4,5)(*this)._currentPtr(4, 5). 같은 클래스 안에있는 메소드에 대한 포인터를 호출하는 올바른 방법은 무엇입니까?C++ : 포인터를 통한 멤버 함수 호출

오류 : 표현이 있어야합니다은 (포인터 대) 함수 타입은

당신은 foo들에서 오는 클래스 컴파일러에게 필요
#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

현재 받고있는 오류 및 오류 메시지는 무엇입니까? –

답변

23

(그렇지 않으면 그들이있어 생각 전역 범위에서 기능) :

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

당신이 여기에 괄호의 집합이 필요합니다

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

감사합니다. 하지만 왜 '&'연산자가 필요한지 혼란 스럽습니다. 함수가 주소로 취급된다고 생각했습니다. – ashur

+2

@ashur 정상적인 기능에는 해당되지만 회원 기능에는 해당되지 않습니다. 후자는 일반적인 포인터가 아닙니다. – jrok

+2

@ashur 회원 포인터의 기능에 대한 흥미로운 내용은 [이 기사] (http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-Fastest-Possible)를 참조하십시오. – jrok

관련 문제