#include #include class Bacteria { public: Bacteria(double c) : nrOfBacteria{1}, consumptionRate{c} { } virtual ~Bacteria() = default; virtual void update(double& nutrients) = 0; virtual void print(std::ostream& os) const = 0; protected: int nrOfBacteria; double consumptionRate; }; class Ecoli : public Bacteria { public: Ecoli(double c) : Bacteria(c) { } void update(double& nutrients) override { double delta { consumptionRate * nrOfBacteria }; if(delta < nutrients) { nutrients -= delta; nrOfBacteria *= growthFactor; growthFactor *= growthRate; } } void print(std::ostream& os) const override { os << "E-coli count: " << nrOfBacteria << " with growth factor: " << growthFactor << std::endl; } private: double growthFactor { 2.0 }; double growthRate { 1.5 }; }; class Saureus : public Bacteria { public: Saureus(double c) : Bacteria(c) { } void update(double& nutrients) override { double delta { consumptionRate * nrOfBacteria }; if(delta < nutrients) { nutrients -= delta; nrOfBacteria *= 3; } } void print(std::ostream& os) const override { os << "S-aureus count: " << nrOfBacteria << std::endl; } }; class PetriDish { public: PetriDish(std::vector colonies, double nutrients) : colonies{colonies}, nutrients{nutrients} { } ~PetriDish() { for (Bacteria* bacteria : colonies) { delete bacteria; } } void simulate() { for (Bacteria* bacteria : colonies) { bacteria->update(nutrients); } } void print(std::ostream& os) const { for (Bacteria* bacteria : colonies) { bacteria->print(os); } os << "Nutrients: " << nutrients << std::endl; } private: std::vector colonies; double nutrients; }; int main() { std::vector colonies { new Ecoli{1}, new Saureus{2} }; PetriDish dish{colonies, 600}; dish.print(std::cout); std::cout << "Simulating 5 time steps..." << std::endl; for(int i{}; i < 5; ++i) { dish.simulate(); } dish.print(std::cout); }