1 // Gets ICE 40.
2 
3 #include <vector>
4 #include<string>
5 #include <iostream>
6 
7 using namespace std;
8 
9 class ODEsolver
10 {
11     private:
12         void eulerODE(vector<double>& y, double& t, double& dt);
13         void midpointODE(vector<double>& y, double& t, double& dt);
14 
15     protected:
16         void (ODEsolver::*useMethod)(vector<double>&, double&, double&);
17         void init();
18 
19     public:
20         ODEsolver();
21         void timeloop(vector<double>& y, double ts, double te, double dt);
22 };
23 
24 
ODEsolver()25 ODEsolver::ODEsolver()
26 {
27   init();
28 }
29 
30 
eulerODE(vector<double> & y,double & t,double & dt)31 void ODEsolver::eulerODE(vector<double>& y, double& t, double& dt)
32 {
33   y[0] = dt * 2.;
34 }
35 
midpointODE(vector<double> & y,double & t,double & dt)36 void ODEsolver::midpointODE(vector<double>& y, double& t, double& dt)
37 {
38   y[0] = dt * 3.;
39 }
40 
41 
42 
init()43 void ODEsolver::init()
44 {
45   ODEsolver::useMethod = &ODEsolver::midpointODE;
46 }
47 
timeloop(vector<double> & y,double ts,double te,double dt)48 void ODEsolver::timeloop(vector<double>& y, double ts, double te, double dt)
49 {
50   (ODEsolver::useMethod)(y,ts,dt); // ERROR - should use this->*
51 }
52 
main(int nargs,char ** args)53 int main (int nargs, char** args)
54 {
55   ODEsolver solver;
56   vector<double> y(2);  double t_start=5.;  double t_end=7.;  double dt=2.;
57   solver.timeloop(y,t_start,t_end,dt);
58   cout << y[0] << endl;
59   return(0);
60 }
61