2013-06-22 169 views
0

我正面臨着一個我一直試圖解決的問題3天的大問題。我有CDS類與intensity_func成員函數和big_gamma成員函數,它基本上是成員intensity_func函數的組成部分。使用其他成員函數的C++成員函數

#include <vector> 
#include <cmath> 

using namespace std 

class CDS 
{ 
public: 
    CDS(); 
    CDS(double notional, vector<double> pay_times, vector<double> intensity); 
    ~CDS(); 


double m_notional; 
vector<double> m_paytimes; 
vector<double> m_intensity; 

double intensity_func(double); 

double big_gamma(double); 

}; 

這裏是CDS.cpp與intensity_func成員函數的定義:

#include <vector> 
#include <random> 
#include <cmath> 

#include "CDS.h" 

double CDS::intensity_func(double t) 
{ 
    vector<double> x = this->m_intensity; 
    vector<double> y = this->m_paytimes; 
    if(t >= y.back() || t< y.front()) 
    { 
     return 0; 
    } 

    else 
    { 
     int d=index_beta(y, t) - 1; 
     double result = x.at(d) + (x.at(d+1) - x.at(d))*(t - y.at(d))/ (y.at(d+1) - y.at(d)); 
     return result; 
    } 

我已經在另一個實施源文件中的函數集成功能,並在intensity_func使用的index_beta功能成員函數(使用辛普森規則)。下面是代碼:

double simple_integration (double (*fct)(double),double a, double b) 
{ 
     //Compute the integral of a (continuous) function on [a;b] 
     //Simpson's rule is used 
     return (b-a)*(fct(a)+fct(b)+4*fct((a+b)/2))/6; 
}; 


double integration(double (*fct)(double),double a, double b, double N) 
{ 
     //The integral is computed using the simple_integration function 
     double sum = 0; 
     double h = (b-a)/N; 
     for(double x = a; x<b ; x = x+h) { 
      sum += simple_integration(fct,x,x+h); 
     } 
     return sum; 
}; 

int index_beta(vector<double> x, double tau) 
{ 
    // The vector x is sorted in increasing order and tau is a double 


    if(tau < x.back()) 
    { 
     vector<double>::iterator it = x.begin(); 
     int n=0; 

     while (*it < tau) 
     { 
      ++ it; 
      ++n; // or n++; 
     } 
     return n; 
    } 

    else 
    { 
     return x.size(); 
    } 


}; 

所以,我想在我的CDS.cpp定義big_gamma成員函數:

double CDS::big_gamma(double t) 
{ 
    return integration(this->intensity, 0, t); 
}; 

但很明顯,它不工作,我得到以下錯誤消息:reference to non static member function must be called。然後我試圖將intensity成員函數變成一個靜態函數,但新問題出來了:我不能再使用this->m_intensitythis->m_paytimes,因爲我收到以下錯誤消息:Invalid use of this outside a non-static member function

回答

4

double (*fct)(double)聲明瞭「指向函數指針」類型的參數。您需要將其聲明爲「指向成員函數」,而不是:double (CDS::*fct)(double)。此外,你需要在其上調用指針到成員的對象:使用帶有例如正弦函數雙竇(雙X)的集成功能時

(someObject->*fct)(someDouble); 
+0

但在我的main.cpp {返回罪( x);},它完美地工作。 – marino89

+0

@ marino89 - 完全正確。 '竇'是一個普通的函數,你可以用指向函數來指向它。 '強度'是一個成員函數,你可以用指向成員函數指向它。 –

+0

好的,所以我需要做的是:'雙CDS :: big_gamma(雙t) { double(CDS :: * fptr)(double); fptr =&CDS :: intensity_func; 返回積分(fprt,0,t,1000); };'。問題是我沒有使用你所說的一個對象來調用指向成員的指針。我需要什麼樣的對象? – marino89