2016-12-28 478 views
1

在非静态类中,我可以直接传递如下的函数成员rhs吗?它报告了一些错误。我也试图将其更改为mystepper.do_step(this->rhs)它仍然不起作用。但如果我把mystepper.do_step(rhs);放在主函数中,而rhs作为一个函数,它就可以正常工作。我该如何解决这个问题?非常感谢!传递函数成员作为类C++中的参数

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

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

我做了一些最低限度的代码来说明我以前question.Your帮助表示高度赞赏!

#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; 
    } 
+1

使它成为'静态'。 – StoryTeller

+0

使它成为'静态函数'或使用'std :: bind'''lambda函数'来知道它应该被调用的对象。 – paweldac

+0

它通过改变rhs作为静态函数来工作!但是,如果我在动物发起的不同实例中有不同的rhs中有多个参数,那该怎么办呢?任何其他方式使代码工作,而不改变rhs作为静态函数? – drbombe

回答

1

可以使RHS()函数在您的类静态的,如果它不访问任何类成员变量的,因为它似乎在你的榜样。如果您需要rhs()作为类的非静态方法,您可以使用std :: bind()(如果您的编译器符合C++ 11)或boost :: bind(),则可以使用std :: bind将类方法绑定到类实例(即“this”)。
参见示例in this other StackOverflow answer

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

无论如何,从你的源代码片段中并不清楚你想要做什么,并且我建议你包含一个最小但完整的源代码,以显示你的需求,以及更好的定义“不起作用”和“有些错误”。

+0

lambda函数也将工作 – paweldac

+0

@paweldac:对,添加为另一个选项 – roalz

+0

我是新来的C++,我仍然无法找出解决方案。这是一个极简主义的代码来说明我正在尝试做什么。非常感谢您的帮助! – drbombe

1

你可以使用拉姆达,所以你可以用调用类方法的函数:

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

但看你的rhs功能,它可以很容易地类的静态函数(有向成员没有呼叫动物课内)。

相关问题