首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将公共但非静态成员函数与ALGLIB集成

将公共但非静态成员函数与ALGLIB集成
EN

Stack Overflow用户
提问于 2020-07-14 21:52:39
回答 1查看 111关注 0票数 0

我正在尝试集成一个类的成员函数,并且需要一些帮助!我不能声明函数静态,因为这个函数使用非静态私有成员(更具体地说,使用一个私有成员,这是另一个类)。我正在使用C++17,不能降低的等级

下面是一个模拟我的问题的最小(非)工作示例。目的是找出用什么来代替四个问号“?”在alglib::autogkintegrate(s, ????, params)中。

alglib::autogkintegrate函数有三个参数:

包含集成、积分边界和其他东西的当前值的“状态”( void f(double x, double xminusa, double bminusx, double &y, void *ptr)

  • an

  • a 'state‘?)

  • 函数f,以集成原型可选指针void *ptr的必须是哪个,其中包含函数的额外参数。

以下是不工作的示例:

代码语言:javascript
复制
#include <functional>
#include <iostream>
#include <cmath>

#include "integration.h"

class Foo;
class Bar;

/*****************************
    Class Foo
*****************************/
class Foo
{
    public:
        // Constructor
        Foo(Bar *b, int toto);

        // Function to integrate
        void f(double x, double xminusa, double bminusx, double &y, void *ptr);
        
    private:
        Bar *m_bar;
        int m_toto;
};

Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}

void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
    double *param = (double *) ptr;
    double p1 = param[0];
    double p2 = param[1];

    y = exp(this->m_toto*x)/(p1 * p2);
}

/*****************************
    Class Bar
*****************************/
class Bar
{
    friend Foo;
    public:
        // Constructor
        Bar();
        
    private:
        int m_a, m_b;
};

Bar::Bar() : m_a(2), m_b(5)
{}

/*****************************
    Main program
*****************************/
int main(int argc, char *argv[])
{
    Bar* b = new Bar();

    Foo f(b, 87);

    double arrayParams[2] = {1, 2};
    double (*params)[2] = &arrayParams;

    alglib::autogkstate s;
    double v;
    alglib::autogkreport rep;
    alglib::autogksmooth(0, 1, s);
    alglib::autogkintegrate(s, ????, params);
    alglib::autogkresults(s, v, rep);

    return 0;
}

如果我将函数f声明为静态函数(并在f中删除this->m_toto),则可以使用alglib::autogkintegrate(s, Foo::f, params);集成f。所以真正的问题是如何访问函数f

我试图定义一个指向成员函数的指针(解释#include <functional>),但未能在alglib::autogkintegrate(s, ????, params);中使用它。

重复我的问题:我想使用Alglib``在C++中集成一个类的成员函数

有用的链接:

  1. https://www.alglib.net/translator/man/manual.cpp.html#gs_using段8.5
  2. https://www.alglib.net/translator/man/manual.cpp.html#example_autogk_d1

P.S.:我也在http://forum.alglib.net/viewtopic.php?f=2&t=4352上发布了这个问题,这是一个专门给Alglib的论坛(但是看起来比Stack溢出要活跃得多,因此我的双发帖子。如果我在那里得到答案,我会复制粘贴在这里,反之亦然)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-15 00:39:18

我在http://www.newty.de/fpt/callback.html上找到了一个使用全局变量的解决方案(抱歉.)。如果有人需要的话,我会在这里发布适合我问题的代码:

代码语言:javascript
复制
#include <functional>
#include <iostream>
#include <cmath>

#include "integration.h"

class Foo;
class Bar;

void* pt2Object; // global variable which points to an arbitrary object

/*****************************
    Class Foo
*****************************/
class Foo
{
    public:
        // Constructor
        Foo(Bar *b, int toto);

        // Function to integrate
        void f(double x, double xminusa, double bminusx, double &y, void *ptr);

        // Wrapper
        static void Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr);
        
    private:
        Bar *m_bar;
        int m_toto;
};

Foo::Foo(Bar *b, int toto) : m_bar(b), m_toto(toto)
{}

void Foo::f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
    double *param = (double *) ptr;
    double p1 = param[0];
    double p2 = param[1];

    y = exp(this->m_toto*x)/(p1 * p2);
    // y = exp(x)/(p1 * p2);
}

void Foo::Wrapper_To_Call_f(double x, double xminusa, double bminusx, double &y, void *ptr)
{
    // explicitly cast global variable <pt2Object> to a pointer to TClassB
    // warning: <pt2Object> MUST point to an appropriate object!
    Foo* mySelf = (Foo*) pt2Object;

    // call member
    mySelf->f(x, xminusa, bminusx, y, ptr);
}

/*****************************
    Class Bar
*****************************/
class Bar
{
    friend Foo;
    public:
        // Constructor
        Bar();
        
    private:
        int m_a, m_b;
};

Bar::Bar() : m_a(2), m_b(5)
{}

/*****************************
    Main program
*****************************/
int main(int argc, char *argv[])
{
    Bar* b = new Bar();

    // Create Foo
    Foo myFoo(b, 1);
    // Assign global variable which is used in the static wrapper function
    // important: never forget to do this!!
    pt2Object = (void*) &myFoo;

    double arrayParams[2] = {1, 2};
    double (*params)[2] = &arrayParams;

    alglib::autogkstate s;
    double v;
    alglib::autogkreport rep;
    alglib::autogksmooth(0, 1, s);
    alglib::autogkintegrate(s, Foo::Wrapper_To_Call_f, params);
    alglib::autogkresults(s, v, rep);

    std::cout << v << std::endl;

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62904534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档