2017-03-17 153 views
0

我遇到以下一段代碼甚至無法編譯的問題。 問題是上線C++:函數指針和類成員

class2_ = new Class2(myFunction);

其實,我現在不如何引用myFunction的,我也嘗試過class2_ = new Class2(&Class3::myFunction);但是編譯器仍然抱怨:(

2約束:

  • 功能myFunction的不能被聲明爲static
  • 此代碼將在一個Arduino的基礎項目中使用,我不能使用的boost ::綁定

你能幫我嗎?

感謝。

class Class2 { 
    typedef void(*MyFunction) (int what); 
    MyFunction fn_; 
public: 
    Class2(MyFunction fn) : fn_(fn) {} 

    void invoke(int val) { 
     fn_(val); 
    } 
}; 

class Class3 { 
    Class2* class2_; 
public: 
    Class3() { 
     class2_ = new Class2(myFunction); 
     class2_->invoke(12); 
    } 

    void myFunction(int what) { 
     // Do some work 
    } 
}; 

void test2() { 
    Class3 instance3; 
} 
+1

你不能提供一個非靜態成員函數到一個非成員函數的預期,這是因爲成員函數有一個隱含的「這個」參數您在調用該函數時需要提供這些信息。 –

+0

你的功能總是在課堂上嗎? – Netwave

+2

你能夠使用C++ 11嗎? –

回答

0

您需要使用pointer to member function

class Class3; 

class Class2 { 
    typedef void(Class3::*MyFunction) (int); 
    MyFunction fn_; 
public: 
    Class2(MyFunction fn) : fn_(fn) {} 

    void invoke(Class3 *p, int val) { 
    (p->*fn_)(val); 
    } 
}; 

class Class3 { 
    Class2* class2_; 
public: 
    Class3() { 
    class2_ = new Class2(&Class3::myFunction); 
    class2_->invoke(this, 12); 
    } 

    void myFunction(int what) { 
    // Do some work 
    } 
}; 

如果您希望的Class2接受帶有簽名void(int),那麼類模板,功能包裝,lambda表達式等,將幫助任何可調用的對象。

+0

嗨菲利克斯,很多謝謝你的提示,它工作正常:)(以及丹尼爾的解決方案) – steph

0

如何使用的接口爲:

class ClassWithFunction { 
public: 
    virtual void myFunction(int what) = 0; 
} 


class Class2 { 
    ClassWithFunction* fn_; 
public: 
    Class2(MyFunction* fn) : fn_(fn) {} 

    void invoke(int val) { 
     fn_->myFunction(val); 
    } 
}; 

class Class3 : ClassWithFunction { 
    Class2* class2_; 
public: 
    Class3() { 
     class2_ = new Class2(this); 
     class2_->invoke(12); 
    } 

    void myFunction(int what) { 
     // Do some work 
    } 
}; 
+0

嗨丹尼爾,非常感謝您的提示,它工作正常:)(以及felix的解決方案) – steph