2017-01-31 9 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"よりも優れた名前を使用していれば)、もっときれいです。

関連する問題