2011-02-01 3 views
3

test.calculate에서 함수 포인터 할당 (및 나머지는 어떻게 작동합니까?)을 얻으려면 어떻게해야합니까?동일한 개체의 멤버 함수에 C++ 함수 포인터 할당

#include <iostream> 

class test { 

    int a; 
    int b; 

    int add(){ 
     return a + b; 
    } 

    int multiply(){ 
     return a*b; 
    } 

    public: 
    int calculate (char operatr, int operand1, int operand2){ 
     int (*opPtr)() = NULL; 

     a = operand1; 
     b = operand2; 

     if (operatr == '+') 
      opPtr = this.*add; 
     if (operatr == '*') 
      opPtr = this.*multiply; 

     return opPtr(); 
    } 
}; 

int main(){ 
    test t; 
    std::cout << t.calculate ('+', 2, 3); 
} 

답변

8

코드에 몇 가지 문제가 있습니다.

먼저 int (*opPtr)() = NULL;은 멤버 함수에 대한 포인터가 아니며, 자유 함수에 대한 포인터입니다. 이 같은 멤버 함수 포인터를 선언 : 이 같은 멤버 함수의 주소을 찍을 때

int (test::*opPtr)() = NULL;

둘째, 당신은 클래스 범위를 지정해야합니다

if (operatr == '+') opPtr = &test::add; 
if (operatr == '*') opPtr = &test::multiply; 

를 마지막으로 호출 멤버 함수 포인터를 통해 특별한 구문이 있습니다 :

return (this->*opPtr)(); 

예 :

#include <iostream> 

class test { 

    int a; 
    int b; 

    int add(){ 
     return a + b; 
    } 

    int multiply(){ 
     return a*b; 
    } 

    public: 
    int calculate (char operatr, int operand1, int operand2){ 
     int (test::*opPtr)() = NULL; 

     a = operand1; 
     b = operand2; 

     if (operatr == '+') opPtr = &test::add; 
     if (operatr == '*') opPtr = &test::multiply; 

     return (this->*opPtr)(); 
    } 
}; 

int main(){ 
    test t; 
    std::cout << t.calculate ('+', 2, 3); 
} 
+0

감사합니다. 방금 날 구 했어요. – toochin

+1

@PeterMortensen : 그 남자 *가되지 마십시오. 아무도 그 사람을 좋아하지 않아. –

3

이와 비슷한 int (test::*opPtr)() = NULL;. http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1

편집을 참조하십시오 또한 if (operatr == '+') opPtr = &test::add; 대신 [..] = this.addreturn (this->(opPtr))(); 대신 return opPtr();를 사용합니다. 실제로 FAQ와 같은 typedef와 매크로와 클래스 멤버 인 ab 대신 멤버 함수 매개 변수를 사용하십시오.

+0

사실,하지만 이보다 더 많은 문제가 있습니다. –

관련 문제