From 67075394b3090d2cf6803c4cbd592233d66f2d27 Mon Sep 17 00:00:00 2001 From: Nicolette Date: Wed, 14 Nov 2018 16:40:05 +0100 Subject: [PATCH 1/2] Make exercise 01 compile --- exercise/01/animal.cpp | 26 +++++++++++++++++++++++ exercise/01/animal.h | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 exercise/01/animal.cpp create mode 100644 exercise/01/animal.h diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp new file mode 100644 index 0000000..601db58 --- /dev/null +++ b/exercise/01/animal.cpp @@ -0,0 +1,26 @@ +#include "animal.h" + +std::wstring animal::species() const +{ + return std::wstring(); +} + +unsigned int animal::legs() const +{ + return 0; +} + +std::wstring leg_counter::add_animal(const animal & animal) +{ + return std::wstring(); +} + +unsigned int leg_counter::legs() const +{ + return 0; +} + +animal animal_factory(int index) +{ + return animal(); +} diff --git a/exercise/01/animal.h b/exercise/01/animal.h new file mode 100644 index 0000000..45cffc9 --- /dev/null +++ b/exercise/01/animal.h @@ -0,0 +1,48 @@ +#pragma once +#include + +class animal +{ +public: + std::wstring species() const; + unsigned int legs() const; +}; + +class insect : public animal +{ + +}; + +class bird : public animal +{ + +}; + +class spider : public animal +{ + +}; + +class cockroach : public insect +{ + +}; + +class sparrow : public bird +{ + +}; + +class tarantula : public spider +{ + +}; + +class leg_counter +{ +public: + std::wstring add_animal(const animal& animal); + unsigned int legs() const; +}; + +animal animal_factory(int index); \ No newline at end of file From 9bd6b4027ff9ed634cd5290d6554f3a92f26a526 Mon Sep 17 00:00:00 2001 From: Nicolette Date: Wed, 14 Nov 2018 18:41:46 +0100 Subject: [PATCH 2/2] Make exercise 01 green --- exercise/01/animal.cpp | 57 ++++++++++++++++++++++++++++++++++-------- exercise/01/animal.h | 56 +++++++++++++++++++++++++++++++++-------- 2 files changed, 93 insertions(+), 20 deletions(-) diff --git a/exercise/01/animal.cpp b/exercise/01/animal.cpp index 601db58..27f5de3 100644 --- a/exercise/01/animal.cpp +++ b/exercise/01/animal.cpp @@ -1,26 +1,63 @@ #include "animal.h" +#include -std::wstring animal::species() const +animal::~animal() { } + +const std::wstring cockroach::type = L"cockroach"; + +std::wstring cockroach::species() const { - return std::wstring(); + return type; } -unsigned int animal::legs() const +unsigned int insect::legs() const { - return 0; + return number_of_legs; } -std::wstring leg_counter::add_animal(const animal & animal) +const std::wstring sparrow::type = L"sparrow"; + +std::wstring sparrow::species() const { - return std::wstring(); + return type; } -unsigned int leg_counter::legs() const +unsigned int bird::legs() const { - return 0; + return number_of_legs; } -animal animal_factory(int index) +const std::wstring tarantula::type = L"tarantula"; + +std::wstring tarantula::species() const { - return animal(); + 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 index 45cffc9..b2e0ecd 100644 --- a/exercise/01/animal.h +++ b/exercise/01/animal.h @@ -4,45 +4,81 @@ class animal { public: - std::wstring species() const; - unsigned int legs() const; + 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& animal); + std::wstring add_animal(const animal_factory& factory); unsigned int legs() const; -}; -animal animal_factory(int index); \ No newline at end of file +private: + unsigned int number_of_legs = 0; +};