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
63 changes: 63 additions & 0 deletions exercise/01/animal.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include "animal.h"

unsigned int insect::legs() const
{
return 6u;
}

std::wstring cockroach::species() const
{
return L"cockroach";
}

unsigned bird::legs() const
{
return 2u;
}

std::wstring sparrow::species() const
{
return L"sparrow";
}

unsigned int spider::legs() const
{
return 8u;
}

std::wstring tarantula::species() const
{
return L"tarantula";
}

std::unique_ptr<animal> animal_factory(const int id)
{
switch (id)
{
case cockroachId:
return std::make_unique<cockroach>();
case sparrowId:
return std::make_unique<sparrow>();
case tarantulaId:
return std::make_unique<tarantula>();
default:
throw std::invalid_argument("Animal with id " + std::to_string(id) + " doesn't exist!");
}
}

leg_counter::leg_counter() : legCount(0)
{
}

unsigned int leg_counter::legs() const
{
return legCount;
}

std::wstring leg_counter::add_animal(const std::unique_ptr<animal> animal)
{
legCount += animal->legs();

return animal->species();
}

66 changes: 66 additions & 0 deletions exercise/01/animal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#pragma once
#include <string>

class animal
{
public:
virtual ~animal() = default;
virtual std::wstring species() const = 0;
virtual unsigned int legs() const = 0;
};

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
{
public:
leg_counter();
std::wstring add_animal(std::unique_ptr<animal>);
unsigned int legs() const;

private:
unsigned int legCount;
};

std::unique_ptr<animal> animal_factory(int id);

enum AnimalIds
{
cockroachId = 1,
sparrowId = 2,
tarantulaId = 3
};