Is it possible to pass an abstract class as an argument and use its member functions as shown below? (Summary: A model is created that needs a solver derived from a base class, and where the system of equations to be solved may change).
#include <iostream>
#include <string>
#include <functional>
class AbstractSolver {
public:
virtual ~AbstractSolver(){}
virtual double solve() = 0;
virtual void setSystem(std::function<double(double,double)> system) = 0;
};
class ConcreteSolver : public AbstractSolver {
protected:
double stepSize;
double initialValue;
std::function<double(double, double)> system;
public:
ConcreteSolver(double stepSize,
double initialValue) :
stepSize(stepSize),
initialValue(initialValue) {}
double solve() {
// implementation here ...
}
void setSystem(std::function<double(double,double)> system) {
this->system = system;
}
};
class Model {
protected:
std::function<double(double,double,double)> system;
AbstractSolver * solver;
public:
Model(AbstractSolver * solver,
std::function<double(double, double, double)> system ) {
this->solver = solver;
this->system = system;
}
~Model() {
delete solver;
}
double getSolution(double tau) {
std::function<double(double, double)> sys =
[this, tau](double t, double y) { return system(t, y, tau); };
solver->setSystem(sys); // SIGSEGV
return solver->solve();
}
};
int main(){
std::function<double(double, double, double)> system =
[](double t, double y, double tau) {
return 0;// return some mathematical expression
};
AbstractSolver * solver = new ConcreteSolver(0, 1);
Model model = Model(solver, system);
model.getSolution(0.1);
}
This will compile, but the problem is that it seg faults where I've put the comment above. Can anyone explain why (I wasn't able to find anything with regards to this)? Your suggestions are welcome