#include #include using namespace std; class Animal { public: Animal() : m_isAlive(true) {}; Animal(bool isAlive) : m_isAlive(isAlive) {}; bool IsAlive() const { return m_isAlive; }; void Died() { m_isAlive = false; } virtual string Eats() = 0; private: bool m_isAlive; }; class Lion : public Animal { public: Lion() : Animal() {}; Lion(bool isAlive) : Animal(isAlive) {}; virtual string Eats() { return "meat"; } }; class Lamb : public Animal { public: Lamb() : Animal() {}; Lamb(bool isAlive) : Animal(isAlive) {} virtual string Eats() { return "grass"; } }; class Shark : public Animal { public: Shark() : Animal() {}; Shark(bool isAlive) : Animal(isAlive) {}; virtual string Eats() { return "people"; } }; class CageOccupiedEx { public: CageOccupiedEx() : m_message("The cage is occupied!") {} string what() { return m_message; } private: string m_message; }; template class Cage { public: Cage() : m_occupied(false) {}; void Enter(T & animal); T Leave(); private: T m_animal; bool m_occupied; }; template void Cage::Enter(T & animal) { if (m_occupied) throw CageOccupiedEx(); m_animal = animal; m_occupied = true; } template T Cage::Leave() { T tmpAnimal = m_animal; m_animal = ""; m_occupied = false; return tmpAnimal; } int main() { Lion leo; Lion simba; Lamb lambert; Shark leon; Cage lionCage; Cage lambCage; cout << "Leo is entering his cage" << endl; try { lionCage.Enter(leo); } catch (CageOccupiedEx &e) { cout << "Error: " << e.what() << endl; } cout << "Lambert is entering his cage" << endl; try { lambCage.Enter(lambert); } catch (CageOccupiedEx &e) { cout << "Error: " << e.what() << endl; } cout << "Simba is entering his cage" << endl; try { lionCage.Enter(simba); } catch (CageOccupiedEx &e) { cout << "Error: " << e.what() << endl; } return 0; }