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