#include <iostream>
using namespace std;
enum Position {GOALTENDER, DEFENCEMEN, FORWARD} ;
typedef unsigned short int USHORT;
const int DEFAULT_PLAYERS_COUNT = 6;
class Player

{public:
    // это приватные атрибуты класса, доступ к которым есть только изнутри класса
    string itsName;
    USHORT itsHeight;
    USHORT itsWeight;
    USHORT itsStamina;
    Position itsPosition;


    // все, что после public - общедоступно в коде снаружи
    Player();   // конструктор по умолчанию
    Player(string name, USHORT height, USHORT weight, USHORT stamina);  // конструктор с параметрами
	Player* setPosition(Position); 
    Position getPosition();  // метод класса для получения позиции текущего игрока
    void printInfo();   // метод класса для вывода инфо об игроке
};


Player::Player()
{
    itsName = "Стандартный игрок 1";
    itsHeight = 150;    // к члену текущего создаваемого экземпляра класса можно обратиться так (коротко)
    this->itsWeight = 70;   // а можно "официальнее" через указатель на текущий экземпляр класса
    itsStamina = 5;
}
Player::Player(string name, USHORT height, USHORT weight, USHORT stamina) :
        itsName(name), itsHeight(height), itsWeight(weight), itsStamina(stamina)
{
    // намеренно оставлено пустым, потому как можно в конструкторах члены класса определять способом выше
    // субъективно, читать такой код тяжелее
}
Position Player::getPosition()
{
    return itsPosition;
}

void Player::printInfo()
{
    cout << "Player *" << itsName << "* (height: " << itsHeight << ", weight:" << itsWeight
         << ", stamina:" << itsStamina << ")" << endl << endl;
}

Player* Player::setPosition(Position newPosition)
{
    this->itsPosition = newPosition;

    return this;
}

class Team {
public:
    Player* itsPlayers = new Player[DEFAULT_PLAYERS_COUNT];
    Team();     // конструктор по умолчанию
    ~Team();    // деструктор

    /**
     * Выводит список игроков текущей команды с указанной позицией
     *
     * Бывает, что реализацию методов вставляют в объявление класса. Технически, так можно, но читать такое тяжело
     * и лучше подобное не делать!
     */
    void printTeamByPosition(Position position)
    {
        for (int i = 0; i < DEFAULT_PLAYERS_COUNT; ++i) {
            std::cout <<i<<" "<<itsPlayers[i].getPosition()<<" "<<itsPlayers[i].itsHeight<<"\n";

            if (itsPlayers[i].getPosition() != position) {
                continue;
            }

            itsPlayers[i].printInfo();
        }
        std::cout <<"\n\n";
    }


};


Team::Team()
{
    itsPlayers[0] = *(new Player());

    Player* player = new Player("Войнов", 190, 100, 10);
    player->setPosition(Position::DEFENCEMEN);
    itsPlayers[1] = *player;

    player = new Player("Малкин", 170, 85, 7);
    player->setPosition(Position::FORWARD);
    itsPlayers[2] = *player;

    player = new Player("Бобровский", 183, 93, 6);
    player->setPosition(Position::GOALTENDER);
    itsPlayers[3] = *player;

}



int main() {
	Team* redWings = new Team();
    Team* blueStars = new Team();

    redWings->printTeamByPosition(Position::GOALTENDER);
    blueStars->printTeamByPosition(Position::DEFENCEMEN);
	return 0;
}