2012-06-28 203 views
1

這已經打敗了我。我想要一個靜態類變量,它是一個指向(非靜態)成員函數的指針。我嘗試了各種方式,但沒有運氣(包括使用typedef,這似乎給了我一個不同的錯誤)。在下面的代碼中,我有靜態類函數指針funcptr,我可以從類外成功調用它,但不是從成員函數CallFuncptr內部 - 這正是我想要做的。有什麼建議麼?靜態成員函數指針保存非靜態成員函數

#include <stdio.h> 

class A 
{ 
public: 
    static int (A::*funcptr)(); 
    int Four() { return 4;}; 
    int CallFuncptr() { return (this->*funcptr)(); } 
     // doesn't link - undefined reference to `A::funcptr' 
}; 
int (A::*funcptr)() = &A::Four; 

int main() 
{ 
    A fred; 
    printf("four? %d\n", (fred.*funcptr)()); // This works 
    printf("four? %d\n", fred.CallFuncptr()); // But this is the way I want to call it 
} 

回答

3

嘗試此代替:

#include <iostream> 

class A { 
public: 
    typedef int (A::*AMemFn)(); 
    static AMemFn funcptr; 
    int Four() { return 4; } 
    int CallFuncptr() { return (this->*funcptr)(); } 
}; 

A::AMemFn A::funcptr = &A::Four; 

int main() 
{ 
    A fred; 
    std::cout << "four? " << fred.CallFuncptr() << std::endl; 
} 
+0

工程款待 - 非常感謝! – bandjalong

0

靜態變量不是特定對象的成員 - 它只能通過類的名稱空間來訪問。 CallFuncptr應該被重寫: int CallFuncptr() { return (*funcptr)(); 我認爲應該工作,因爲這個函數可以訪問A的名字空間中的函數而不指定它。

此外,函數指針更多的是C構造而不是C++。您可以訪問靜態變量的類之外的代碼: A::CallFuncptr 因爲CallFunctptr只是駐留在命名空間

2

jweyrich大約有一個好看的工作(我建議你使用它),但我想我會詳細說明在代碼真正的問題是什麼:

你的問題是這樣的一行:

int (A::*funcptr)() = &A::Four; 

這是定義一個名爲funcptr全局變量是正確的類型,而不是A::funcptr

你需要的是這個爛攤子:

int (A::*(A::funcptr))() = &A::Four; 

這醜陋的爛攤子就是爲什麼我建議你去下typedef的路徑來獲得一個很好看的版本一樣jweyrich的解決方案。

+0

啊,謝謝! ..我在想這些 - 只是不能猜測如何附加第二個A ::。這確實有點不明顯.. – bandjalong

相關問題