#include <iostream>
#include <memory>
#include <string>
class Person;
enum class ECharTypes
{
GOOD,
ZOMBIE
};
class Character
{
public:
Character() : a(420){}
virtual ~Character() = 0;
virtual void Talk() const = 0;
friend Person;
protected:
Person* AttachedPerson;
int a;
};
Character::~Character()
{}
class LOIPON_ZOMBIE final : public Character
{
public:
LOIPON_ZOMBIE() : Character(), b(5){}
~LOIPON_ZOMBIE() override = default;
void Talk() const override
{
std::cout << "BLRHLRBRGBLBL!" << std::endl;
}
friend Person;
private:
int b;
};
class Good final : public Character
{
public:
Good() : Character(), aaa("blaze it fagit"){}
~Good() override = default;
void Talk() const override
{
std::cout << "Smoke weed everyday!" << std::endl;
}
friend Person;
private:
std::string aaa;
};
class Person final
{
private:
std::unique_ptr<Character> AttachedCharacter;
public:
Person() = delete;
Person(ECharTypes CharType)
{
switch (CharType)
{
case ECharTypes::GOOD:
std::cout << "I'm Good and ready for some ass-whooping!" << std::endl;
AttachedCharacter = std::make_unique<Good>();
break;
case ECharTypes::ZOMBIE:
std::cout << "BRRRAINZZ!" << std::endl;
AttachedCharacter = std::make_unique<LOIPON_ZOMBIE>();
break;
default:
std::cerr << "Pali thn ekanes" << std::endl;
exit(1);
break;
}
AttachedCharacter->AttachedPerson = this;
}
~Person() = default;
void Talk() const
{
AttachedCharacter->Talk();
}
void Convert(ECharTypes ConvertType)
{
switch (ConvertType)
{
case ECharTypes::GOOD:
{
auto Temp = std::make_unique<Good>();
AttachedCharacter.reset(Temp.release());
std::cout << "Converted to Good!" << std::endl;
break;
}
case ECharTypes::ZOMBIE:
{
auto Temp = std::make_unique<LOIPON_ZOMBIE>();
AttachedCharacter.reset(Temp.release());
std::cout << "Converted to Zombie!" << std::endl;
break;
}
default:
std::cerr << "Pali edw eisai?" << std::endl;
exit(2);
break;
}
AttachedCharacter->AttachedPerson = this;
}
};
int main() {
Person P(ECharTypes::GOOD);
P.Talk();
P.Convert(ECharTypes::ZOMBIE);
P.Talk();
return 0;
}