diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..27f5de3 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,63 @@ +#include "animal.h" +#include + +animal::~animal() { } + +const std::wstring cockroach::type = L"cockroach"; + +std::wstring cockroach::species() const +{ + return type; +} + +unsigned int insect::legs() const +{ + return number_of_legs; +} + +const std::wstring sparrow::type = L"sparrow"; + +std::wstring sparrow::species() const +{ + return type; +} + +unsigned int bird::legs() const +{ + return number_of_legs; +} + +const std::wstring tarantula::type = L"tarantula"; + +std::wstring tarantula::species() const +{ + return type; +} + +unsigned int spider::legs() const +{ + return number_of_legs; +} + +std::wstring leg_counter::add_animal(const animal_factory & factory) +{ + std::unique_ptr animal = factory.create_animal(); + number_of_legs += animal->legs(); + return animal->species(); +} + +unsigned int leg_counter::legs() const +{ + return number_of_legs; +} + +std::unique_ptr animal_factory::create_animal() const +{ + switch (animal_num) + { + case 1: return std::make_unique(); + case 2: return std::make_unique(); + case 3: return std::make_unique(); + } + throw std::invalid_argument("There is no animal with that number!"); +} \ No newline at end of file diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..b2e0ecd --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,84 @@ +#pragma once +#include + +class animal +{ +public: + virtual std::wstring species() const = 0; + virtual unsigned int legs() const = 0; + virtual ~animal() = 0; +}; + +class insect : public animal +{ +public: + ~insect() {}; + unsigned int legs() const override; +private: + static const unsigned int number_of_legs = 6; +}; + +class bird : public animal +{ +public: + ~bird() {}; + unsigned int legs() const override; +private: + static const unsigned int number_of_legs = 2; +}; + +class spider : public animal +{ +public: + ~spider() {}; + unsigned int legs() const override; +private: + static const unsigned int number_of_legs = 8; +}; + +class cockroach : public insect +{ +public: + ~cockroach() {}; + std::wstring species() const override; +private: + static const std::wstring type; +}; + +class sparrow : public bird +{ +public: + ~sparrow() {}; + std::wstring species() const override; +private: + static const std::wstring type; +}; + +class tarantula : public spider +{ +public: + ~tarantula() {}; + std::wstring species() const override; +private: + static const std::wstring type; +}; + +class animal_factory +{ +public: + animal_factory(unsigned int animal_num) : animal_num(animal_num) {}; + std::unique_ptr create_animal() const; + +private: + unsigned int animal_num; +}; + +class leg_counter +{ +public: + std::wstring add_animal(const animal_factory& factory); + unsigned int legs() const; + +private: + unsigned int number_of_legs = 0; +};