diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..2773405 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,73 @@ +#include "animal.h" + +unsigned int insect::legs() const +{ + return 6; +} + +std::wstring cockroach::species() const +{ + return L"cockroach"; +} + +unsigned int bird::legs() const +{ + return 2; +} + +std::wstring sparrow::species() const +{ + return L"sparrow"; +} + +unsigned int spider::legs() const +{ + return 8; +} + +std::wstring tarantula::species() const +{ + return L"tarantula"; +} + +std::wstring leg_counter::add_animal(const animal_factory& animal_fac) +{ + auto animal = animal_fac.get_animal(); + nlegs += animal->legs(); + return animal->species(); +} + +unsigned int leg_counter::legs() const +{ + return nlegs; +} + +animal_factory::animal_factory(unsigned int id) +{ + switch (id) + { + case 1: + a = new cockroach; + break; + case 2: + a = new sparrow; + break; + case 3: + a = new tarantula; + break; + default: + throw std::invalid_argument("Wrong id."); + } +} + +animal_factory::~animal_factory() +{ + if (!a) + return; + delete a; +} + +animal* animal_factory::get_animal() const +{ + return a; +} diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..7c7a9ef --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,64 @@ +#include + +class animal +{ +public: + virtual std::wstring species() const = 0; + virtual unsigned int legs() const = 0; + virtual ~animal() = default; +}; + +class animal_factory +{ + animal* a; +public: + animal_factory(unsigned int id); + ~animal_factory(); + animal* get_animal() const; +}; + + +class insect : public animal +{ +public: + unsigned int legs() const override; +}; + +class cockroach : public insect +{ +public: + std::wstring species() const override; +}; + +class bird : public animal +{ +public: + unsigned int legs() const override; +}; + +class sparrow : public bird +{ +public: + std::wstring species() const override; +}; + +class spider : public animal +{ +public: + unsigned int legs() const override; +}; + +class tarantula : public spider +{ +public: + std::wstring species() const override; +}; + +class leg_counter +{ + unsigned int nlegs; +public: + leg_counter() : nlegs(0) {}; + std::wstring add_animal(const animal_factory& animal_fac); + unsigned int legs() const; +};