C ++在另一个函数中调用类函数

时间:2014-12-22 10:14:31

标签: c++ function class function-pointers

我试图通过给出类成员函数作为参数来调用类中的外部函数(它将函数作为输入)。我的代码如下:

using namespace std;
// This is my external function
double integrate (double a, double b, int steps, double (*func)(double)){
    // code for integration using function pointer
};

Class A
{
    protected:
        vector<double> to_data, from_data;
        int data_size;

    public:
        A (); // constructor

        double calculate_parameter(double t){
            // some class member function that makes use of other class members
        };

        double get_result(double x){
            double sum = 0;
        for (int i=0;i<data_size;i++){
           // this is basically what causes the error
            sum = sum + integrate(to_data[i],from_data[i],1,calculate_parameter);
        }
 };

}

但是,它显示错误,函数calculate_parameter无法转换。我想出一种方法来解决这个问题,就是修改外部函数,使得它也需要一个类对象。有没有办法在不实例化新类对象的情况下执行此操作?提前谢谢!

2 个答案:

答案 0 :(得分:9)

更通用的方法是放弃这些20世纪70年代的功能指针,并使用本千年的技术:

#include <functional>

double integrate (double a, double b, int steps, std::function<double(double)> f)
{
    // ...
}

class A
{
    double calculate_parameter(double t);

    double get_result(double x)
    {
        using std::placeholders::_1;

        double sum = 0;
        for (int i = 0; i < data_size; i++) {
            sum = sum + integrate(
                to_data[i],
                from_data[i],
                1,
                std::bind(&A::calculate_parameter, this, _1)
            );
        }

        return sum;
    }
};

这提供了一种简单易用的方法,可以绑定到基本上任何类型的函数,并且可以“烧掉”#34;成员函数的this指针指向仿函数本身,而不需要在最终的调用点(即integrate内)任何魔法,只需要调用f!)。


更多&#34;现代&#34;这样做的方法是将调用包装在lambda中的calculate_parameter

template <typename Callable>
double integrate (double a, double b, int steps, Callable f)
{
    // ...
}

class A
{
    double calculate_parameter(double t);

    double get_result(double x)
    {
        double sum = 0;
        for (int i = 0; i < data_size; i++) {
            sum = sum + integrate(
                to_data[i],
                from_data[i],
                1,
                [this](double x) { return this->calculate_parameter(x); }
            );
        }

        return sum;
    }
};

请注意,我已使用推导出的模板参数std::function<double(double)>替换了Callable;你没有 来做这件事,但是当你不必要时,不要强制进行lambda-to std::function转换。 (个人我非常希望能够强制fdouble并返回double,而不必依赖其使用来检查这一点。 )

答案 1 :(得分:-1)

此函数calculate_parameter必须是静态的。 阅读有关函数对象的更多信息 Fuction Objects