2017-10-29 243 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);