2016-12-28 102 views
1

在非靜態類中,我可以直接傳遞如下的函數成員rhs嗎?它報告了一些錯誤。我也試圖將其更改爲mystepper.do_step(this->rhs)它仍然不起作用。但如果我把mystepper.do_step(rhs);放在主函數中,而rhs作爲一個函數,它就可以正常工作。我該如何解決這個問題?非常感謝!傳遞函數成員作爲類C++中的參數

void Animal::rhs(const double x , double &dxdt , const double t) {  
      dxdt = 2*t; 
     }; 

void Animal::response() {  
    mystepper.do_step(rhs); 
} 

我做了一些最低限度的代碼來說明我以前question.Your幫助表示高度讚賞!

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

使它成爲'靜態'。 – StoryTeller

+0

使它成爲'靜態函數'或使用'std :: bind'''lambda函數'來知道它應該被調用的對象。 – paweldac

+0

它通過改變rhs作爲靜態函數來工作!但是,如果我在動物發起的不同實例中有不同的rhs中有多個參數,那該怎麼辦呢?任何其他方式使代碼工作,而不改變rhs作爲靜態函數? – drbombe

回答

1

可以使RHS()函數在您的類靜態的,如果它不訪問任何類成員變量的,因爲它似乎在你的榜樣。如果您需要rhs()作爲類的非靜態方法,您可以使用std :: bind()(如果您的編譯器符合C++ 11)或boost :: bind(),則可以使用std :: bind將類方法綁定到類實例(即「this」)。
參見示例in this other StackOverflow answer

C++ 11編譯器的另一種選擇是使用lambda functions

無論如何,從你的源代碼片段中並不清楚你想要做什麼,並且我建議你包含一個最小但完整的源代碼,以顯示你的需求,以及更好的定義「不起作用」和「有些錯誤」。

+0

lambda函數也將工作 – paweldac

+0

@paweldac:對,添加爲另一個選項 – roalz

+0

我是新來的C++,我仍然無法找出解決方案。這是一個極簡主義的代碼來說明我正在嘗試做什麼。非常感謝您的幫助! – drbombe

1

你可以使用拉姆達,所以你可以用調用類方法的函數:

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

但看你的rhs功能,它可以很容易地類的靜態函數(有向成員沒有呼叫動物課內)。

相關問題