2011-08-26 85 views
1

請參見下面的代碼 - 我想知道如何,或者如果它甚至有可能,寫)A :: DoThisOrThat的身體((簡單?)指向非靜態成員函數的問題

class A 
{ 
    void DoThis(void) { // any function body you like... } 
    void DoThat(void) { // any function body you like... } 

    void DoThisOrThat(const bool doThis); 
}; 

void A::DoThisOrThat(const bool doThis) 
{ 
    void (*pMemberFunction)(void); 
    pMemberFunction = doThis? &A::DoThis : &A::DoThat; 

    (*pMemberFunction)(); // member function invoked controlled by parameter 
} 

此函數的所有三行可能需要重寫才能正確確定成員函數的範圍。正如所寫,我在第二行中得到了一個調用約定衝突,我分配了pMemberFunction。我無法舉出一個簡單的例子來說明這一點 - 所有的例子很容易找到聲明一個成員變量來保存成員函數指針。我能不能創建一個局部變量來做同樣的事情?

+0

指針到成員的語法總是讓我的頭受傷... –

回答

7

我可能會錯過一些東西,但這不是更容易和更簡單嗎?

void A::DoThisOrThat(bool doThis) 
{ 
    if(doThis) { DoThis(); } 
    else  { DoThat(); } 
} 

假設你真的想要去的函數指針的路線,實現pointer to member functions are completely different beasts from pointers to non-member functions。他們不同的一種方式是你需要爲函數提供一個對象來調用。語法如下:

void A::DoThisOrThat(bool doThis) 
{ 
    void (A::*pMemberFunction)(); 
    pMemberFunction = doThis ? &A::DoThis : &A::DoThat; 
    (this->*pMemberFunction)(); 
} 

注意,聲明一個成員函數指針的時候,你也必須指定類(注意A::*)和對象(注意this->*)。還要記住,在形成指向成員的指針時,您必須完全限定函數名稱,即使是在類中,也可以使用與號(例如&A::DoThis,您已正確完成)。

+0

感謝 - 清晰,全面和快速的答案:)我想採取函數指針路由的原因是因爲我實際上正忙於等待,而我從一個設備寄存器,並且不想重複測試幾個條件之一來決定我需要調用哪個函數來輪詢設備。 – omatai

7

成員函數不是免費的函數,而指向成員函數(PTMF)的是而不是函數指針!它們完全不兼容。 (通常它們要大得多。)更重要的是,如果您同時擁有PTMF 實例指針,則只能使用調用成員函數。

所以,你不得不說:(不是說有任何理由量間接的,如果你想要的是對一個地方的條件分支)

void A::DoThisOrThat(const bool doThis) 
{ 
    void (A::*pMemberFunction)(void); 
    pMemberFunction = doThis? &A::DoThis : &A::DoThat; 

    (this->*pMemberFunction)(); 
} 

+1

太棒了 - 我知道必須有一種簡單的方法來將其範圍限定在類和實例中。碰巧,我需要在忙於輪詢設備寄存器的循環中應用這個原則,所以避免重複調用「if」語句是一種獎勵。謝謝! – omatai

1

替換這些:

void (*pMemberFunction)(void); 
(*pMemberFunction)(); // member function invoked controlled by parameter 

有:

void (A::*pMemberFunction)(void); 
(*this->pMemberFunction)(); // member function invoked controlled by parameter 
相關問題