将函数成员作为C ++类中的参数传递

时间:2016-12-28 08:39:32

标签: c++

在非静态类中,我可以直接传递函数成员rhs,如下所示吗?它报告了一些错误。我也尝试将其更改为mystepper.do_step(this->rhs)它仍然无法正常工作。但是如果我将mystepper.do_step(rhs);放在main函数中,并将rhs作为函数放置,它就能正常工作。我该如何解决这个问题?非常感谢!

void Animal::rhs(const double x , double &dxdt , const double t) {    
            dxdt = 2*t;
        };

 void  Animal::response() {    
    mystepper.do_step(rhs);   
}

我制作了一些极简主义代码来说明我之前的问题。非常感谢您的帮助!!

 #include <iostream>

    using namespace std;
    class ABC{
    private:
        int x =3;
        int add2num(int a, int b){
            return a+b+x;
        }

        int worker(int &fun(int a, int b), int a, int b){
            return fun(a,b);
        }
    public:
        int doSomething(int a, int b){
            return worker(add2num, a, b);
        }
    };

    int main() {
        ABC test;
        cout << test.doSomething(3,5) << endl;
        return 0;
    }

2 个答案:

答案 0 :(得分:1)

您可以使用lambda,因此可以在函数中包含对class方法的调用:

void  Animal::response() {    
    mystepper.do_step([&](const double x , double &dxdt , const double t) 
        { return rhs(x, dxdt, t); });   
}

但是看看你的rhs函数,它很容易就是一个静态类函数(里面没有对Animal类成员的调用)。

答案 1 :(得分:0)

如果你的示例中没有访问任何类成员变量,你可以在你的类中使rhs()函数为静态。

或者,如果你需要rhs()作为类的非静态方法,你可以使用std :: bind()(如果你的编译器符合C ++ 11)或者boost :: bind()来将类方法绑定到类实例(即&#34;此&#34;) 请参阅示例in this other StackOverflow answer

C ++ 11编译器的另一个选择是使用lambda functions

无论如何,您的源代码片段并不是很清楚您想要做什么,我建议您添加一个最小但完整的源代码,以显示您的需求,以及更好地定义&#34;没有&#39;工作&#34;和#34;一些错误&#34;。