2017-10-29 238 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

您无法设置成员函数 - 事实。最多你可以让'RHS'成为一个常规的函数指针。 – StoryTeller

回答

0

函数指针是做事情的“C”的方式。在这里,你可以使RHS函数指针在this答案建议,或者您可以通过使用std::function喜欢做的“C++”的方法:在构造函数本身

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

和intialize:

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}  
{ } 

,或者你可以做到这一点里面setRhs()

void RhsOdeProblem::setRhs(std::function<double(double,double)> rhs) { 
    RHS = rhs; 
} 

为什么std::function你可能会问,因为std::function是一个更通用的方法(它接受函数指针,lambdas,带有过载的类operator(),并且您也可以从std::bind创建std::function)。

但是,std::function可能会生成比函数指针略大的字节码。

2

您不能设置(成员)函数。一个函数在C++中不是一个可变的东西。

幸运的是,您不必;你可以简单地定义RHS是一个函数指针:

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

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

后来就这样称呼它:

double result = RHS(x, y);