2017-01-05 77 views
3

我想用一個方法調用一個函數的對象(但每個對象應該有一個不同的函數來調用)。我會試着告訴你我通過展示一個例子的意思是:你可以傳遞一個函數,以便稍後調用它嗎?

class Human 
{ 
    public: 
     void setMyFunction(void func); // specify which function to call 
     void callMyFunction(); // Call the specified function 
}; 

void Human::setMyFunction(void func) // '' 
{ 
    myFunction = func; 
} 

void Human::callMyFunction() // '' 
{ 
    myFunction(); 
} 

void someRandomFunction() // A random function 
{ 
    // Some random code 
} 

int main() 
{ 
    Human Lisa;  // Create Object 
    Lisa.setMyFunction(); // Set the function for that object 
    Lisa.callMyFunction(); // Call the function specified earlier 
} 

此代碼(顯然)不工作,但我希望你明白我試圖完成。

MFG,TPRammus

+3

你會想要使用[std :: function](http://en.cppreference.com/w/cpp/utility/functional/function)。 –

+0

要傳遞給類的函數的簽名是相同還是應該接受'int(int,int)','double(double)'和'void(int)'...? – NathanOliver

+0

你也可以使用[函數指針](http://www.cprogramming.com/tutorial/function-pointers.html)。 – Gavin

回答

5

您可以使用std::function

#include <functional> 

class Human 
{ 
    std::function<void()> mFunc; 
public: 
    void setMyFunction(std::function<void()> func) { mFunc = func; } 
    void callMyFunction() { if (mFunc) mFunc(); } 
}; 

Demo

+0

爲什麼'std :: function'? – SergeyA

+1

是通用的,並允許捕獲lambda。 – Jarod42

+0

但OP是否需要它?有一個相關的成本。感謝編輯,btw – SergeyA

4

我建議使用一個簡單的函數指針。只是這樣做:

class Human 
{ 
    public: 
     using func_t = void (*)(); 
     void setMyFunction(func_t f) { 
      func = f; 
     } 
     void callMyFunction() { 
      func(); 
     } 
    private: 
     func_t func; 
}; 

爲什麼一個人可能喜歡函數指針std::function的原因是:

  • 性能。調用std::function往往比用指針調用函數要慢。
  • std::function當需要將其綁定到重載函數時,需要真正難看的語法。

例子:

void foo(); 
void foo(int x = 0); 

void check() { 
    Human h; 
    h.setMyFunction(&foo); 
} 

將無法​​編譯。

+5

Downvoting很酷。解釋它的原因更酷。 – SergeyA

相關問題