2014-12-22 89 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

相關問題