2014-02-11 123 views
2

如何將C++中的成員函數重載到其他成員函數(或函數指針)?如何將成員函數分配給重載的成員函數指針?

我的目標是包裝成員函數。我有以下代碼,它不工作,因爲它有2個「Do」。我想要做的是將Do1Do2包裹到Do與任何double *double **。因此,我只能運行Do,不需要關心Do1Do2。 (也許,我應該指定需要Do1Do2之間進行選擇的條件。)

class Sample { 
    int (*Do)(double *arr); 
    int (*Do)(double **arr); 
    int Do1(double *arr); 
    int Do1(double **arr); 
    int Do2(double *arr); 
    int Do2(double **arr); 
}; 

或者你對這個目標有什麼建議?

此外:對於Thomas,函數對象(函子)是一個好主意,但它只能解決重載問題。我想選擇功能(例如,Do1Do2)。我有幾個規定的功能,我可以選擇其中的一個到Do。但是,我也想將自定義功能分配給Do。 例如,當我運行Do時,我可以運行Do1,Do2或我自己的新定製功能。 (我應該設置什麼功能將被執行時,我做一個實例)

和..我不能在我的情況下使用C++ 11。 (我想,但我的服務器有一個較舊的GCC版本)

+2

您是否嘗試過使用函數對象而不是函數指針? –

回答

1

您的代碼格式不正確,無法編譯。你可以重載函數,但不是對象!也就是說,你不能有兩個不同類型的名爲'Do'的指針。我無法完全記得,但MSVC會告訴你這樣的事情:

'Sample :: Do':redefinition;不同的基本類型

如果你想要做這樣的事情,你可以使用標誌:

class Sample 
{ 
    int Do(double *arr); 
    int Do(double **arr); 
    int Do1(double *arr); 
    int Do1(double **arr); 
    int Do2(double *arr); 
    int Do2(double **arr); 

    void SetDoVersion(int version); 

    int _do_version; 
}; 

和 '做' 應該是這樣的:

int Sample::Do(double *arr) 
{ 
    //For more than 2-3 versions you could also use switch(). 
    if(this->_do_version == 1) 
    return this->Do1(arr); 
    else 
    return this->Do2(arr); 
} 

int Sample::Do(double **arr) 
{ 
    //same as above 
} 

SetDoVersion()套目前'已安裝'版本:

void Sample::SetDoVersion(int version) 
{ 
    this->_do_version = version; 
} 

這是proba爲此任務提供最簡單的解決方案。

+0

我知道我的代碼有一個錯誤,並且我收到了編譯器的消息。您的答案將是不錯的選擇,但是如果我想將自定義函數添加到「Do」,這個解決方案將不適合我。謝謝您的回答。 –