从函数指针初始化成员函数

时间:2017-10-29 08:30:42

标签: c++ function function-pointers

我不知道如何从构造函数传递的函数指针初始化成员函数。 我的类有一个成员函数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?或者哪种方式最好? 提前谢谢

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

函数指针是" C"做事的方式。在这里,您可以按照this回答中的建议将RHS设为函数指针,或者您可以执行" C ++"使用std::function之类的方式:

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

并初始化构造函数本身:

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()的类,你也可以创建{{} 1}}来自std::function)。

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