Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions exercise/01/animal.cpp
Original file line number Diff line number Diff line change
@@ -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;
}
64 changes: 64 additions & 0 deletions exercise/01/animal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <string>

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;
};