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

initialize member function from function pointer

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

您无法设置(成员)功能。函数在 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);

函数指针是 "C" 做事的方式。在这里,您可以按照 答案中的建议将 RHS 设置为函数指针,或者您可以使用 std::function 以 "C++" 方式进行操作,例如:

#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 是一种更通用的方法(它接受函数指针、lambda、类 和重载的 operator() 和您还可以从 std::bind).

创建 std::function

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