从函数指针初始化成员函数
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
可能会生成比函数指针稍大的字节码。
我不知道如何从传递给构造函数的函数指针初始化成员函数.. 我的 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" 做事的方式。在这里,您可以按照 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
可能会生成比函数指针稍大的字节码。