#include <iostream>
#include <cstring>
#include <string>

using namespace std;

enum class Gender : unsigned char
{
	Unrelated	= 0,
	Male,
	Female,
};

inline string GetnderToStr( Gender gender )
{
	const char* gender_strings[] = { "unrelated", "male", "female" };
	return { gender_strings[ static_cast<unsigned char>( gender ) ] };
};

struct Person
{
	string	m_name;
	string	m_surname;
	int		m_age;
	Gender	m_gender;
};

struct Adult : Person
{
	string	m_work_place;
	Person*	m_spouse		= nullptr;
	
	std::string GetDescription();
};

std::string Adult::GetDescription()
{
	string description = m_surname + " " + m_name + ", " + std::to_string( m_age ) + " years old, " + GetnderToStr( m_gender );
	
	if( m_spouse == nullptr )
	{
		description += ", single";
	}
	else
	{
		description += ", married on " + m_spouse->m_name + " " + m_spouse->m_surname;
	}
	
	if( !m_work_place.empty() )
	{
		description += ", " + m_work_place;
	}
	else
	{
		description += ", unworked";
	}
	
	return description;
}

int main()
{
    Adult neo;
	
	neo.m_name			= "Thomas";
	neo.m_surname		= "Anderson";
	neo.m_age			= 30;
	neo.m_gender		= Gender::Male;
	neo.m_work_place	= "Metacortex";
    
    std::cout << neo.GetDescription();
    return 0;
}
