2013-08-22 16 views
0

我有以下電話:傳遞函數在C++的說法

void Derived::GetEntry(Skill&); 
InorderTraverse(GetEntry); 

其中要求

void Base<ItemType>::InorderTraverse(void Visit(ItemType&)) const 

試圖編譯書面生成

錯誤C3867:「派生:: GetEntry':函數調用缺少的參數列表;使用 '&派生:: GetEntry' 來創建一個指針構件

使用&派生:: GetEntry生成

不能從「無效轉換參數1(__thiscall派生:: *)(技巧& )」到‘無效(__cdecl *)(ItemType的&)’

更改聲明靜態無效GetEntry ......解決這些問題,但也帶來了新的問題(即我不能交流(非靜態成員引用必須是相對於特定對象)

我有一個類似的遍歷操作,可以很好地處理靜態聲明,因爲被調用的函數只是顯示關於它被調用的每個對象的信息。

我一直在尋找幾天的答案,我覺得這很簡單。有沒有辦法在另一個函數調用中使用非靜態函數作爲參數?

完整的代碼是:https://github.com/mindaika/SkillTree

+0

重複http://stackoverflow.com/questions/400257/how-can-i-pass-a-class-member-function-as-a回調 –

+1

沒有看到實際的代碼使得它在理解這個問題上有些問題(至少對我而言)。第一個片段甚至不是有效的C++代碼,因爲第一行是*聲明*,第二個是實際的函數調用。什麼是*實際*問題?你是否試圖將一個指向成員的函數傳遞給另一個用於枚舉算法的函數?來自Zac的相關問題涵蓋了這一點。 – WhozCraig

+0

如果您確切知道您將傳遞哪些函數,並且可以從希望調用它們的上下文訪問這些函數,則可以將該函數傳遞給枚舉,然後在呼叫站點進行切換。當然,這並不靈活。 – didierc

回答

0

正如我在我的問題中提到的,我試圖解決由於使用靜態變量導致的「內存泄漏」(它實際上不是泄漏,因爲靜態被破壞,但直到泄漏檢測器運行)。我結束了對這裏描述的封裝指針的修改:C++ freeing static variables

3

編輯:插滿工作示例來代替。

我建議你改用std函數指針。

例如:

#include <functional> 
void main() 
{ 
class TheClass 
{ 
public: 

    TheClass() 
    { 
     m_function = (std::tr1::bind(&TheClass::run, this)); 
    }; 

    void run() 
    { 
      // stuff to do 
    }; 

    std::tr1::function<void()> m_function; 
}; 

TheClass theclass; 
theclass.m_function(); 

} 

m_function(); //調用函數

+0

或者,只要使用C++ 11,而不是每次都附加':: tr1',或者如果C++ 03是必須的,則需要boost。反正+1。 – 2013-08-22 15:32:29

+0

@Adam我嘗試了你提供的例子,爲我的代碼進行了修改,但它似乎沒有工作。然而,閱讀其他一些評論,它看起來像::綁定最終是解決方案,我只需要了解如何正確使用它。謝謝! –