2017-01-31 4 views
0

클래스에 함수를 저장하고이 함수를 멤버 함수 내에서 호출하기를 원합니다. 나는 이것이 함수 포인터를 사용하여 가능하다는 것을 알고 있지만 이것에 대해서는 std::function을 사용하고 싶다. 여기 C++에서 클래스에 함수 전달

가 작동하지 않고 내가하고 싶은 것을 증명해야 할 몇 가지 코드 :

double foo(double a, double b){ 
    return a + b; 
} 


class Test{ 
private: 
     std::function<double(double,double)> foo_ ; 
public: 
     Test(foo); 
     void setFoo(foo) {foo_ = foo;} 
     double callFoo(double a, double b){return foo_(a,b);} 
}; 


int main(int argc, char const *argv[]) { 
    Test bar = Test(foo); 
    bar.callFoo(2,3); 
    return 0; 
} 
+5

* 작동하지 않는 코드가 있습니다. * 작동하지 않는 방법/이유를 지정하는 것이 좋습니다. 컴파일하지 않습니까? 그렇다면 오류를 제공하십시오. 런타임 에러? 콜 스택 및/또는 오류를 제공하십시오. 잘못된 출력입니까? 입/출력을 제공하십시오. – Borgleader

답변

5

당신은 거의 바로 그것을했다,하지만 생성자의 유형과 setFoo 잊었 :

#include <functional> 
#include <iostream> 

double foo(double a, double b) { 
    return a + b; 
} 

class Test { 
private: 
    std::function<double(double, double)> foo_; 
public: 
    // note the argument type is std::function<> 
    Test(const std::function<double(double, double)> & foo) : foo_(foo) {} 
    // note the argument type is std::function<> 
    void setFoo(const std::function<double(double, double)>& foo) { foo_ = foo; } 
    double callFoo(double a, double b) { return foo_(a, b); } 
}; 

int main(int argc, char const *argv[]) { 
    Test bar = Test(foo); 
    bar.callFoo(2, 3); 
    return 0; 
} 

그런데 길고 복잡한 이름을 피하기 위해 typedef를 사용하는 것이 유리합니다. 예를 들면 다음과 같습니다.

typedef std::function<double(double,double)> myFunctionType 

어디서나 myFunctionType을 사용할 수 있습니다. 더 읽기 쉽습니다 ("myFunctionType"보다 더 나은 이름을 제공한다면). 그리고 더 깔끔합니다.