[英]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::function
從std::bind
)。
但是, std::function
可能會生成比函數指針稍大的字節碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.