gpt4 book ai didi

c++ - GSL 中的静态虚拟解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:27 24 4
gpt4 key购买 nike

你好,我正在尝试使用 GNU 科学图书馆的微分方程包编写一个小程序来模拟动力系统。该问题并非特定于 GSL,但我只是为您提供所有详细信息

在目前的设计中,我想要一个抽象的Experiment 类,其中所有的复杂函数都将由gsl 库调用。显式系统的动力学将由两个函数定义,即 func 和 jacob,它们分别定义特定的运动方程和 jacobian。因此,我想在 Experiment 类中进行所有模拟,并且只用将由 Experiment 继承的特定类覆盖两个虚函数。

我遇到的问题是,作为虚拟,这些方法无法编译

错误:“int (Experiment::)(double, const double*, double*, void*)”类型的参数与“int (*)(double, const double*, double*, void*)'

如果我将这两个函数设为静态,程序可以编译,但我会失去我想要针对特定​​问题实现的功能。

显然,它们不能既是静态的又是虚拟的,所以有人知道这个问题的解决方法吗?有什么建议可以更好地处理它吗?

提前致谢。

编辑:下面的代码编译但它们不是虚拟的

class Experiment
{
public:
Experiment();
~Experiment();

void setupExperiment();
static int func(double t, const double y[], double f[], void *params);
static int jac (double t, const double y[], double *dfdy, double dfdt[], void *params);
};

void Experiment::setupExperiment(){

double mu = 10;

gsl_odeiv2_system sys = {func, jac, 2, &mu}; //Here is the problem with virtual functions
}

class aSpecificProblem: public Experiment{

// I want to implement just the func and jac function which should be virtual above
};

最佳答案

我假设您函数定义中的 void* 是用户指定的回调参数。在这种情况下,使用此参数将指针传递给您的对象并使您的回调成为静态函数。在此静态函数内,将此指针转换回正确的类型 (Experiment*) 并调用该函数的非静态版本。

class Experiment
{
public:
Experiment();
~Experiment();

void setupExperiment();
static int static_func(double t, const double y[], double f[], void *params);
static int static_jac (double t, const double y[], double *dfdy, double dfdt[], void *params);
virtual int func(double t, const double y[], double f[]);
virtual int jac (double t, const double y[], double *dfdy, double dfdt[]);
};

void Experiment::setupExperiment()
{
gsl_odeiv2_system sys = {static_func, static_jac, 2, this}; //Here is the problem with virtual functions
}

int Experiment::static_func(double t, const double y[], double f[], void *params)
{
return ((Experiment*)params)->func(t, y, f);
}

int Experiment::static_jac (double t, const double y[], double *dfdy, double dfdt[], void *params)
{
return ((Experiment*)params)->jac(t, y, dfdy, dfdt);
}

class aSpecificProblem: public Experiment
{
public:
virtual int func(double t, const double y[], double f[]);
virtual int jac (double t, const double y[], double *dfdy, double dfdt[]);
};

关于c++ - GSL 中的静态虚拟解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com