簡體   English   中英

從函數指針初始化成員函數

[英]initialize member function from function pointer

我不知道如何從構造函數上傳遞的函數指針初始化成員函數。我的類具有成員函數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::functionstd::bind )。

但是, std::function可能會生成比函數指針稍大的字節碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM