2015-11-22 32 views
0

我試圖將指針傳遞到一個成員函數的非成員函數,如以下例子:C++,傳遞一個成員指針到一個非成員函數

class Main 
{ 
    static void runMain (void (*progress)(double)) 
    { 
     for (int i=1; i<=100; ++i) 
     { 
      // Do something 
      progress(i/100.0); 
     } 
    } 
}; 

class A 
{ 
    void setProgress (double) {/*Do something else*/} 
    void runA() 
    { 
     Main::runMain (&setProgress); // Error: incompatible parameter from void(A::*)(double) to void(*)(double) 
    } 
}; 

class B 
{ 
    void updateProgress (double) {/*More things to do*/} 
    void runB() 
    { 
     Main::runMain (&updateProgress); // The same error 
    } 
}; 

這一結果與由於錯誤從A傳遞給Main的類型函數void(A :: *)(double)不匹配void(*)(double)。

如何在以下約束條件下傳遞成員函數:我不允許更改A類和B類的結構,除了runA和runB實現(但我可以更改包括其功能簽名的Main類) 。

謝謝!

+0

使成員函數'static'。 –

+0

成員函數在沒有用'this'調用時是否有效?函數如何知道哪些類數據可以運行? – mah

+2

讓'Main :: runMain'接受['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)。然後使用你最喜歡的方法傳遞函數+上下文。 – StoryTeller

回答

-2

因此,可能你通常使用C#編寫代碼。 在C++指向函數(或靜態函數)的指針不能用指向類的方法(成員函數)的指針進行編譯。

也許passing-member-function-as-argument幫助你。

其中一個可能的解決方案:

class IProgressUpdater { 
public: 
    virtual void updateProgress(double) = 0; 
}; 

class Main 
{ 
public: 
    static void runMain (IProgressUpdater* progressUpdater) 
    { 
     for (int i=1; i<=100; ++i) 
     { 
      // Do something 
      progressUpdater->updateProgress(i/100.0); 
     } 
    } 
}; 

class A : public IProgressUpdater 
{ 
    virtual void updateProgress(double) {/*Do something else*/} 
    void runA() 
    { 
     Main::runMain(static_cast<IProgressUpdater*>(this)); 
    } 
}; 

class B : public IProgressUpdater 
{ 
    virtual void updateProgress(double) {/*More things to do*/} 
    void runB() 
    { 
     Main::runMain(static_cast<IProgressUpdater*>(this)); 
    } 
}; 
+0

第一句話是無關緊要的。其餘的都是如此,但這並不意味着沒有辦法去做OP所需要的。 – StoryTeller