У меня возникла большая проблема, которую я пытаюсь решить напрасно в течение 3 дней. У меня есть класс CDS
с функцией-членом intensity_func
и функцией-членом big_gamma
, которая является в основном интегралом элемента intensity_func
.C++ member функция используя другой член функция
#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;
}
я реализовал в другом исходном файле функции для интеграции функции и функции index_beta
, используемой в intensity_func
член (используя правило Симпсона). Вот код:
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_paytimes
, поскольку появляется следующее сообщение об ошибке: Invalid use of this outside a non-static member function
.
Но в моей main.cpp при использовании функции интеграции с, например, функция синусового двойной пазухи (двойной х) {вернуть грех (x);}; работает отлично. – marino89
@ marino89 - точно вправо. 'sinus' - обычная функция, и вы указываете на нее указателем на функцию. 'intensity' является функцией-членом, и вы указываете на нее с помощью функции указатель-член. –
Итак, что мне нужно сделать: 'double CDS :: big_gamma (double t) { double (CDS :: * fptr) (double); fptr = & CDS :: intensity_func; интеграция возврата (fprt, 0, t, 1000); }; '. Проблема в том, что я не использую, поскольку вы сказали объект для вызова указателя на член. Какой предмет мне нужен? – marino89