2013-05-27 127 views
2

所以,我有一個函數,稱爲容安瀾,這需要一個功能第一個參數:在C++中,如何將對象的方法作爲參數傳遞給函數?

int Romberg(double (*f)(double), ...); 

執行時,它會應用傳遞函數幾個值。

在一類,我已經定義了下列方法:

double Funktion::q(double x){ 
    return(sqrt(1.0+fd(x)*fd(x))); 
}; 
void Funktion::compute_bogen(){ 
    Romberg(q, ...); 
}; 

哪裏fd是從相同類的另一種方法。但是,這不起作用!我嘗試用以下方法修改代碼,最終成功地將該方法傳遞給Romberg函數;但隨後未申請傳遞函數:

int Romberg(double (Funktion::* &f)(double), ...); 

void Funktion::compute_bogen(){ 
    Romberg(&Funktion::q, ...); 
}; 

我收到以下錯誤信息:

error C2064: term does not evaluate to a function taking 1 arguments 

現在,我看不出如何讓沒有扔掉全班系統這項工作我建造了。

+0

的問題是,你還需要通過實例來調用它。 http://blog.slaks.net/2011/06/delegates-vs-function-pointers-part-2-c.html/ – SLaks

+0

您是否嘗試使用Romberg作爲朋友功能? –

+0

你可以使你的函數'f'靜態或免費函數嗎? – Andrei

回答

2

我收到以下錯誤信息:

錯誤C2064:術語不計算爲函數取1個參數

這是因爲Funktion::q偷偷需要兩個參數,一個this指針和double

問題是,Romberg沒有關於在Funktion::compute_bogen()中調用它的對象的任何信息,所以它不能將它提供給Funktion::q()。你可能想是這樣的:

typedef double (Funktion::*RombergFuncArg)(double) 

int 
Romberg(RombergFuncArg func, Funktion& obj, ...) 
{ 
    double input = 0.0; 
    double output = (obj.*func)(input); 
    //... 
} 

[編輯]在答覆評論:

void Funktion::compute_bogen(){ 
    Romberg(&Funktion::q, *this, ...); 
}; 
+0

我該如何調用'Romberg'函數? – Alex

+0

非常感謝,它做到了:) – Alex

1

,使其與你的類系統工作,你需要定義fd採取一個指向成員函數,而不是一個指向函數(兩者相同)。

然後,您需要正確調用指向成員函數的指針(與調用指向函數的指針略有不同)。

我會注意到,雖然你可以做到這一點,但考慮到有些不同的結構可能會更好。一個相當常見的方法是使用虛擬函數,您將在各種派生類中重寫該虛函數。然後,不是使用指向成員函數的指針,而是選擇實現所需函數的對象,並調用該對象中的虛函數。

相關問題