【问题标题】:Pass function member as a parameter within a class C++将函数成员作为 C++ 类中的参数传递
【发布时间】:2016-12-28 08:39:31
【问题描述】:

在非静态类中,我可以像下面这样直接传递函数成员 rhs 吗?它报告了一些错误。我还尝试将其更改为mystepper.do_step(this->rhs)它仍然不起作用。但是如果我将mystepper.do_step(rhs); 放在主函数中,并将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;
    }

【问题讨论】:

  • 让它static
  • 设为static function或使用std::bind`lambda 函数`来知道应该在哪个对象上调用它。
  • 它通过将 rhs 更改为静态函数来工作!但是,如果我在 rhs 中有许多参数在由 Animal 发起的不同实例中是不同的呢?还有其他方法可以在不将 rhs 更改为静态函数的情况下使代码正常工作吗?
  • 查看下面的答案...学习 std::bind()。

标签: c++


【解决方案1】:

您可以使用 lambda,因此您可以将类方法的调用包装在一个函数中:

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

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

【讨论】:

    【解决方案2】:

    您可以在您的类中将 rhs() 函数设为静态,如果它不访问任何类成员变量,如您的示例中所示。

    或者,如果您需要 rhs() 作为类的非静态方法,您可以使用 std::bind()(如果您的编译器符合 C++11)或 boost::bind()将类方法绑定到类实例(即“this”)。
    查看示例in this other StackOverflow answer

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

    无论如何,从您的源代码 sn-p 并不清楚您想要做什么,我建议您包含一个最小但完整的源代码来显示您的需求,并更好地定义“不起作用”和“一些错误”。

    【讨论】:

    • 我是 C++ 新手,但我仍然无法找到解决方案。这是一个极简主义的代码来说明我正在尝试做的事情。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多