2013-06-22 3 views
0

У меня возникла большая проблема, которую я пытаюсь решить напрасно в течение 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.

ответ

4

double (*fct)(double) объявляет аргумент типа «указатель на функцию». Вам нужно объявить это как «функцию-указатель-член» вместо: double (CDS::*fct)(double). Кроме того, вам нужен объект, на котором вы вызываете указатель на элемент:

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

Но в моей main.cpp при использовании функции интеграции с, например, функция синусового двойной пазухи (двойной х) {вернуть грех (x);}; работает отлично. – marino89

+0

@ marino89 - точно вправо. 'sinus' - обычная функция, и вы указываете на нее указателем на функцию. 'intensity' является функцией-членом, и вы указываете на нее с помощью функции указатель-член. –

+0

Итак, что мне нужно сделать: 'double CDS :: big_gamma (double t) { double (CDS :: * fptr) (double); fptr = & CDS :: intensity_func; интеграция возврата (fprt, 0, t, 1000); }; '. Проблема в том, что я не использую, поскольку вы сказали объект для вызова указателя на член. Какой предмет мне нужен? – marino89