2017-10-29 20 views
0

コンストラクタに渡された関数ポインタからメンバ関数を初期化する方法がわかりません。 私のクラスには、微分問題の関数で変化するメンバ関数RHSがあります。コンストラクタで関数を渡してください! 正しい方法は何ですか?関数ポインタからメンバ関数を初期化する

class RhsOdeProblem 
{ 
    public:  
     // constructor without alalitical solution 
    constexpr RhsOdeProblem (double (*rhs)(double, double), 
           double, double, double, double) noexcept ;  


    virtual ~RhsOdeProblem() noexcept = default ; 
    RhsOdeProblem(const RhsOdeProblem&) noexcept = default; 
    RhsOdeProblem(RhsOdeProblem&&) noexcept = default ; 



    double RHS(double, double); 
    double AnaSol(); 

    double dxdt(double, double);     

    void setRhs(double (*rhs)(double, double)); 
    void setAnaliticalSolution(double (*realSol)(double,double));  

    double startTime ; 
    double endTime ; 
    double dt  ; 
    double initValue ; 
    constexpr static double eps = 10e-8 ; 
    bool analiticalSolution ; 
}; 

constexpr RhsOdeProblem::RhsOdeProblem (double (*rhs)(double, double), 
             double ti, 
             double tf, 
             double dt, 
             double y0) noexcept : startTime{ti}, endTime{tf}, 
                 dt{dt} , initValue{y0} , 
                 analiticalSolution{false}  
{      
     setRhs(rhs); 
}    

どのようにsetRhsを定義できますか?それを行う最善の方法は何ですか? ありがとうございました

+0

メンバ関数post-factを設定することはできません。あなたは 'RHS'を通常の関数ポインタにすることができます。 – StoryTeller

答えて

0

関数ポインタは、物事の「C」の方法です。ここでは、this答えで提案されているように、あなたはRHSに関数ポインタを作ることができるか、などのstd::function使用してそれを「C++」の方法を行うことができます。

constexpr RhsOdeProblem::RhsOdeProblem (std::function<double(double,double)> rhs, 
            double ti, 
            double tf, 
            double dt, 
            double y0) noexcept : startTime{ti}, endTime{tf}, 
                dt{dt} , initValue{y0} , 
                 analiticalSolution{false}, 
RHS{rhs}  
{ } 
:コンストラクタ自体に

#include <functional> 
class RhsOdeProblem 
{ 
    // ... 
    std::function<double(double,double)> RHS; 
    //... 
}; 

とintializeを

setRhs()の内側にそれを行うことができます。

あなたが求めることができる
void RhsOdeProblem::setRhs(std::function<double(double,double)> rhs) { 
    RHS = rhs; 
} 

なぜstd::function、ので、はそれを行うもっと一般的な方法です(関数ポインタ、lambdas、オーバーロードされたクラスoperator()を受け取り、std::bindからstd::functionを作成することもできます)。

ただし、std::functionは、関数ポインタよりわずかに大きなバイトコードを生成することがあります。

2

(メンバー)機能を設定することはできません。関数はC++では可変的なものではありません。

幸いにもあなたはそうする必要はありません。

class RhsOdeProblem 
{ 
    // ... 
    double (*RHS)(double, double); 
    void setRhs(double (*rhs)(double, double)); 
}; 

void RhsOdeProblem::setRhs(double (*rhs)(double, double)) { 
    RHS = rhs; 
} 

以降でこのようにそれを呼び出す:あなたは、単に関数ポインタであることを RHSを定義することができ

double result = RHS(x, y); 
関連する問題