我不知道如何从构造函数传递的函数指针初始化成员函数。 我的类有一个成员函数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 :(得分: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
可能会生成比函数指针略大的字节码。