我正面臨着一個我一直試圖解決的問題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_intensity
和this->m_paytimes
,因爲我收到以下錯誤消息:Invalid use of this outside a non-static member function
。
但在我的main.cpp {返回罪( x);},它完美地工作。 – marino89
@ marino89 - 完全正確。 '竇'是一個普通的函數,你可以用指向函數來指向它。 '強度'是一個成員函數,你可以用指向成員函數指向它。 –
好的,所以我需要做的是:'雙CDS :: big_gamma(雙t) { double(CDS :: * fptr)(double); fptr =&CDS :: intensity_func; 返回積分(fprt,0,t,1000); };'。問題是我沒有使用你所說的一個對象來調用指向成員的指針。我需要什麼樣的對象? – marino89