【问题标题】:one class should invoke method of another class using a function pointer一个类应该使用函数指针调用另一个类的方法
【发布时间】:2014-03-02 04:15:45
【问题描述】:

我已咨询(免责声明):

为了说明我的问题,我将使用此代码(已更新)

#include <iostream>
#include <cmath>
#include <functional>


class Solver{
public:
    int Optimize(const std::function<double(double,double>& function_to_optimize),double start_val, double &opt_val){
        opt_val = function_to_optimize(start_val);
        return 0;
    }
};

class FunctionExample{
public:
    double Value(double x,double y)
    {
        return x+y;
    }
};

int main(){

    FunctionExample F =FunctionExample();
    Solver MySolver=Solver();

    double global_opt=0.0;

    MySolver.Optimize(std::bind(&FunctionExample::Value, &F, std::placeholders::_2),1,global_opt);

    return 0;
}

有没有办法调用方法“Value”?我调用函数没有问题(没有类)

typedef double (*FunctionValuePtr)(double x);

但这对我上面的例子没有帮助。我需要明确的方法名称。大多数示例使用静态方法。我不能使用静态方法。

【问题讨论】:

  • 了解std::functionstd::bind
  • 此外,Square S(); 声明(以及其他两个类似的声明)并没有完全按照您的预期进行。在S 的情况下,它实际上声明了一个函数 S,它不接受任何参数并返回Square 类的实例。

标签: c++ oop pointers methods function-pointers


【解决方案1】:

您可以使用 STL 的 &lt;functional&gt; 标头:

double Gradient(const std::function<double(double)>& func, double y)
{
    const double h = 1e-5;
    return (func(y+h) - func(y)) / h;
}

std::cout << D.Gradient(std::bind(&Root::Value, &R, std::placeholders::_1), 8) << std::endl;

也像 Joachim Pileborg 评论你在 main 中声明函数,所以你需要删除 ()

编辑:

要给绑定一个固定的参数,您可以执行以下操作:

int Optimize(const std::function<double(double)>& function_to_optimize, double &opt_val){
    opt_val = function_to_optimize(opt_val);
    return 0;
}

MySolver.Optimize(std::bind(&FunctionExample::Value, &F, std::placeholders::_1, 1), global_opt);

这将调用F.Value(opt_val, 1)。您还可以将占位符与固定参数交换。

【讨论】:

  • 但是没有类名就没有办法只传递一个函数吗?
  • @wieschoo 成员函数总是需要一个类实例来操作。您能否用一个更接近您的问题的示例来更新您的问题,以及为什么我的解决方案不适合您?
  • 拥有指向类和方法的指针会更好吗?像使用对象“R”和代码“double Eval(R,Value,1,2)”之类的东西我想使用不同的类,它们都有一个方法“Value”。
  • 我更新了更符合我真实情况的例子。
  • @wieschoo 好的,但问题是什么?你原来的如何调用成员函数的问题不是解决了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2014-02-07
相关资源
最近更新 更多