2017-09-16 125 views
1

有沒有辦法使用的一種方式=類型分配的,而不是語法如下:C++分配成員的目標函數,類成員函數

void triggerAttack() { adsr.triggerAttack(); }

我希望做一些事情,如:

void triggerAttack() = adsr.triggerAttack

std::function<void()> triggerAttack = adsr.triggerAttack

void(*triggerAttack)() = adsr.triggerAttack

但沒有任何東西編譯!

示例代碼:

class LinearADSR 
{ 
public: 
    void triggerAttack() { }  
}; 

class JerobeamBlubb : public gen 
{ 
public: 
    void triggerAttack() { adsr.triggerAttack(); } 

protected: 
    LinearADSR adsr; 
}; 
+0

你想達到什麼目的? 1)失敗,因爲語法無效2)和3)失敗,因爲你有成員函數,而不是正常的(並且你使用一個實例來獲取它們) – Rakete1111

+0

只需簡單地繼承某些函數,所以我不必將每個功能從一個類重寫到另一個類。我沒有使用子類,因爲我只需要幾個函數。但我可能會重複這種事情,這是不可避免的。所有類別都需要定製。 –

回答

2

通常,一個成員函數指針從通常的指針不同,因爲它具有與它的類的實例來使用。

所以你的代碼改成這樣:

class LinearADSR 
{ 
public: 
    void triggerAttack() { }  
}; 

class JerobeamBlubb 
{ 
public: 
    void (LinearADSR::*triggerAttack)(); 
protected: 
    LinearADSR adsr; 
}; 

int main() 
{ 
    JerobeamBlubb a; 
    a.triggerAttack = &LinearADSR::triggerAttack; 
} 

關於你的失敗嘗試:

  • void triggerAttack() = adsr.triggerAttack; is invalid syntax
  • std::function<void()> triggerAttack = adsr.triggerAttack失敗,因爲triggerAttack是一個成員函數,而不是通常的功能。正如我之前解釋的,您需要一個它的類的實例。
  • void(*triggerAttack)() = adsr.triggerAttack由於與上述相同的原因而失敗。
+0

我認爲,你錯過了一個非常重要的位:如何使用該功能。從我收集到的(非常第一個代碼段),OP想要像這樣使用它:'a.triggerAttack()' –

+0

這是真的,你不能像那樣使用它? –

+0

'std :: function'與成員函數一起使用。問題是它要求第一個參數是指向函數被調用的對象的指針。如果您在構建時已經知道該對象,請使用'std :: bind'。 – patatahooligan