2014-12-22 64 views
3

我想通过给类的成员函数作为它的参数来调用外部函数(将函数作为输入)在类内部。我的代码如下:C++调用另一个函数内的类函数

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无法转换的错误。我想出了一个解决这个问题的方法,就是修改外部函数,以便它也接受一个类对象。有没有办法做到这一点,而不实例化一个新的类对象?提前致谢!

回答

8

更常用的方法是从这个千年删除这些1970函数指针和使用工艺对象:

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

这提供了绑定到几乎任何一个简单易用的方式功能,并且将“成员函数指针”this“烘烤”到函数本身,而不需要在最终的调用点(即integrate,其实际上只需要调用f!)内的任何魔术。


一个更“现代”的方式来做到这一点的号召换到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-std::function转换。 (个人我很喜欢能够强制要求f将采取double并返回一个double,而不必依赖于它的使用进行检查。)

+1

谢谢!完美解决问题! – AnotherCodingEnthusiast

+2

@nurettin:“自我满足”?什么??尽量不要这么粗鲁,谢谢。 –

+1

相当精确和最好的答案 –

-1

该函数calculate_parameter必须是静态的。 了解更多关于功能的 Fuction Objects

相关问题