Olivier Meplan wrote: > > Hi Rooters! > I have a C++ question....It is related to pointer to functions of a > class. I want define in a base class a method (name RK in the example) > which used pointer to methods of a derived class...and I don't now how > to do. Here is what I do (and which of course don't work): > > the base class A: > > class A { > void (*Fct)(double t,double *X,double *dX); > void RK(...); > }; > RK methods use the pointer Fct. > > then a class B: > > class B : public A { > ... > void EDP1(double t,double *X,double *dX); > void EDP2(double t,double *X,double *dX); > void Evol(...); > }; > > Now in the method Evol(...) I want to use A::RK(...) with either EDP1 or > EDP2 for the pointer Fct (e.g. Fct=EDP1) but the cast don't work. What about the following code. However I do not recommend this ugly style of OO programming. It could work or not depending on C++ compiler. This code works for me using EGCS 1.1.2 on Linux. If I remember correctly it worked for me on Win/NT Visual C++ 5.0/6.0 as well. Better to go and search at Google for "Callbacks in C++" where you get a pointers to some nice and elegant solutions. #include <iostream> // Functor prototype class functor_ddd { public: functor_ddd( double t , double* X, double* dX ) : ft(t),fX(X),fdX(dX) {} virtual void operator()() = 0; protected: double ft; double* fX; double* fdX; }; typedef functor_ddd Fct; class A { public: void RK( Fct* func ) { if( func != 0 ) (*((Fct *)func)) (); } }; class B : virtual public A { public: class func1 : public Fct { public: func1( double t , double* X, double* dX ) : functor_ddd(t,X,dX) {} void operator() () { std::cout << "func1>> " << "t: " << ft << " X: " << *fX << " dX: " << *fdX << std::endl; } }; class func2 : public Fct { public: func2( double t , double* X, double* dX ) : functor_ddd(t,X,dX) {} void operator() () { std::cout << "func2>> " << "t: " << ft << " X: " << *fX << " dX: " << *fdX << std::endl; } }; void Evol( int which, double& a, double& b, double& c) { Fct* pFunc = 0; switch( which ) { case 1: pFunc = new func1( a, &b, &c ); break; case 2: pFunc = new func2( a, &b, &c ); break; default: break; }; A::RK( pFunc ); if( pFunc != 0 ) { delete pFunc; pFunc = 0; } } }; int main( int argc, char* argv[] ) { B go; double tval = 1.; double val = 2.; double dVal = 3.; go.Evol( 1, tval, val, dVal ); tval = 4.; val = 5.; dVal = 6.; go.Evol( 2, tval, val, dVal ); return 0; };
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET