1 に答える
6
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[]);
};
于 2012-05-21T14:45:21.757 に答える