2017-01-05 4 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 
} 

(분명히)이 코드는 작동하지 않습니다하지만 난 당신이 내가 달성하기 위해 노력하고 이해를 바랍니다 : 저는 예를 나타내는 무슨 뜻인지를 보여주기 위해 노력할 것입니다.

제조, 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

일반적이고 람다 캡처가 가능합니다. – 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

다운 투표가 좋습니다. 그 이유를 설명하는 것이 더 시원합니다. – SergeyA

관련 문제