Re: pointers to member functions
Alf P. Steinbach wrote:
* giulianodammando@libero.it:
Thanks a lot Victor and Alf. In the meantime i've found the following
solution.
It works, but I don't know exactly how and why.
No-one can tell you unless you post the code.
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
This is what i meant (should compile cleanly). Obviously this solution
is far from general
because one needs to recompile the C numerical integration library
library (in my case a few files), but I have not modified them
internally. So this serves my purpose. With a precompiled library I
think this method cannot be applied.
Best Regards
Giuliano
// abstract class
class func {
public:
func() {};
virtual ~func() {};
virtual const double operator() (const double x) = 0;
/*virtual const array_1* operator() (const array_1 &vx) = 0;*/
};
// Wrapper for regular functions
template <class T>
class Regular_func : public func {
public:
typedef double (T::*func_ptr)(double);
Regular_func() {}
explicit Regular_func(T *t, func_ptr fun) { T_pointer=t; f = fun;}
const double operator() (const double x) { return (T_pointer->*f)(x);
}
/* const array_1* operator() (const array_1 &vx){ <-- commented (i use
external Array class)
// returns array of values
array_1 *y = new array_1;
y->resize(vx.size());
for(int i= vx.lbound(0); i < vx.ubound(0); i++){
(*y)(i) = (T_pointer->*f)(vx(i));
}
return y;
}*/
private:
T *T_pointer;
func_ptr f;
};
/*
typedef double (*fptr)(double);
int integration_simple (fptr *f,
double a, double b,
double * result, double * abserr); */
int integration_simple (func *f,
double a, double b,
double * result, double * abserr);
int integration_simple (func *f,
double a, double b,
double * result, double * abserr)
{
double result1,result2;
double half = (b-a)/2;
/* very simple trapezoidal rule */
result1 = ((*f)(a)+(*f)(b))/2*(b-a);
result2 = ((*f)(a)+(*f)(half))/2*half + ((*f)(half)+(*f)(b))/2*half;
*abserr = result2-result1;
*result = result2;
return 0;
}
class CrossSection {
public:
CrossSection() : k(5.0) {};
double Y(double x) { return k*x; }
double integrate(double a,double b) {
double result,abserr;
Regular_func<CrossSection> f(this,&CrossSection::Y);
integration_simple (&f,a, b,&result, &abserr);
return result;
}
private:
double k;
};
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main() {
double result;
char dummy;
CrossSection aCrossSection;
result = aCrossSection.integrate(0.0,1.0);
std::cout << result << std::endl;
cin >> dummy;
}